我得到了一个抽象类:

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/

10-11 22:26
查看更多