我获得了一个抽象类:
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中的反思不能直接处理公共摘要&#34;超级?
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)为什么&#34;使用修饰符&#39; protected&#39;&#34;? FooPACImpl.getClass()。getModifiers返回&#34;公共抽象&#34;
2)抛出此异常是因为该类是抽象的吗?或者它是否与可能的构造函数有关&#39; protected FooPACImpl(){};&#39;?
3)而且,这是否可以实现?我的理解是,如果你用BB子类化AA,你可以使用AA预期BB,因为BB将有任何AA预期有的东西(方法,字段等)。虽然,它已经有一段时间了。我对java中的继承细节可能有些模糊。
感谢任何积分/指针,#3的是/否答案就足够了。如果没有&#39;,提示如何在没有反射的情况下实施。如果有帮助,我可以访问自动生成的代码生成器模板。
答案 0 :(得分:1)
在自动生成的FooPACImpl子类中,有两个受保护的构造函数:
protected myReqTypeFooPAC() {
super(...);
}
protected myReqTypeFooPAC(boolean b) {
super(..., b, ...);
}
我在父类中寻找问题,但事实证明它是构造函数。将这些更改为公共允许代码按预期运行,我可以使用反射做什么?或者通过更改codegen模板......