我得到了一个抽象类:
public abstract FooPACImpl {
...
}
和两个自动生成的子类:
public replyTypeFooPAC extends FooPACImpl {
...
}
public requestTypeFooPAC extends FooPACImpl {
...
}
还有一个用于创建使用请求类型和答复类型(期望A和B是FooPACImpl的自动生成的子类,如上所示)的网络模式(请求/答复)的API:
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)是否因为类是抽象的而抛出此异常?还是与可能的构造函数“ protected FooPACImpl(){};”有关?
3)而且,这甚至可以实现吗?我的理解是,如果您将BB与AA一起使用,则可以在需要BB的地方使用AA,因为BB将具有AA希望具有的任何东西(方法,字段等)。虽然,已经有一段时间了。我可能对Java继承的细节有些困惑。
感谢您提出任何要点/指标,对#3的是/否答案就足够了。在“否”的情况下,提示如何无需反思即可实现。我可以访问自动生成的东西的代码生成器模板,如果有帮助的话。
最佳答案
在FooPACImpl的自动生成的子类中,有两个受保护的构造函数:
protected myReqTypeFooPAC() {
super(...);
}
protected myReqTypeFooPAC(boolean b) {
super(..., b, ...);
}
我在父类中寻找问题,但事实证明这是构造函数。将这些更改为公开状态可以使代码按预期运行,我可以使用反射来做到这一点吗?或通过更改代码生成模板...
关于java - Java在公共(public)抽象父类(super class)上反射(reflect)了invalidAccessException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25423132/