我得到了一个抽象类:
public abstract FooPACImpl {
...
}
和两个自动生成的子类:
public replyTypeFooPAC extends FooPACImpl {
...
}
public requestTypeFooPAC extends FooPACImpl {
...
}
还有一个用于创建网络模式(请求/回复)的 API,它使用请求类型和回复类型(A 和 B 应该是自动生成的 FooPACImpl 的子类,如上所示):
Replier<A, B> get_simple_replier (
String topic,
Object<A> requestType,
Object<B> replyType) {...}
Requester<A, B> get_simple_requester (
String topic,
Object<A> requestType,
Object<B> replyType) {...}
我从 XML 存根中提取主题字符串以及 A 和 B 两种类型的字符串名称:
<rr>
<topic>MyReqRepTopic</topic>
<reqtype>foo.bar.baz.myReqTypeFooPAC</reqtype>
<replytype>foo.bar.baz.myReplyTypeFooPAC</replytype>
</rr>
显然,Java 中的反射不能直接处理“公共抽象”超类?
FooPACImpl foopa = (FooPACImpl) Class.forName(reqtypeName).newInstance();
结果是
java.lang.IllegalAccessException: Class foo.bar.fnorb.ServiceSupport \
can not access a member of class foo.bar.baz.myReqTypeFooPAC with \
modifiers "protected"
1)为什么“带有修饰符'受保护'”?FooPACImpl.getClass().getModifiers 返回“公共摘要”
2)这个异常是因为类是抽象的而引发的吗?还是与可能的构造函数“受保护的FooPACImpl(){};”有关?
3)而且,这甚至可以实现吗?我的理解是,如果您将 AA 与 BB 子类化,则可以在预期 BB 的地方使用 AA,因为 BB 将具有预期 AA 具有的任何东西(方法、字段等)。虽然,已经有一段时间了。我可能对java中继承的细节有点模糊。
感谢您提供任何点/指针,对于#3 的是/否答案就足够了。在“否”的情况下,暗示如何在没有反思的情况下实施它。如果有帮助,我确实可以访问自动生成内容的代码生成器模板。