Java反映了公共抽象超类的illegalAccessException

时间:2014-08-21 09:45:10

标签: java reflection abstract-class illegalaccessexception

我获得了一个抽象类:

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;,提示如何在没有反射的情况下实施。如果有帮助,我可以访问自动生成的代码生成器模板。

1 个答案:

答案 0 :(得分:1)

在自动生成的FooPACImpl子类中,有两个受保护的构造函数:

protected myReqTypeFooPAC() {
    super(...);
}

protected myReqTypeFooPAC(boolean b) {
    super(..., b, ...); 
}

我在父类中寻找问题,但事实证明它是构造函数。将这些更改为公共允许代码按预期运行,我可以使用反射做什么?或者通过更改codegen模板......