Java 在公共(public)抽象父类(super class)上反射非法访问异常

标签 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 stub 中提取主题字符串以及两种类型 A 和 B 的字符串名称:

<rr>
    <topic>MyReqRepTopic</topic>
    <reqtype>foo.bar.baz.myReqTypeFooPAC</reqtype>
    <replytype>foo.bar.baz.myReplyTypeFooPAC</replytype>
</rr>

显然,Java 中的反射不能直接处理“公共(public)抽象”父类(super class)?

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) 为什么“使用修饰符‘ protected ’”? FooPACImpl.getClass().getModifiers 返回“公共(public)抽象”

2) 这个异常是因为类是抽象类而抛出的吗?或者它是否与可能的构造函数“protected FooPACImpl () { };”有关?

3)而且,这可以实现吗?我的理解是,如果你用 BB 子类化 AA,你可以在需要 BB 的地方使用 AA,因为 BB 将拥有 AA 预计拥有的任何东西(方法、字段等)。虽然,已经有一段时间了。我可能对java中继承的细节有点模糊。

感谢您的任何观点/指点,对于#3 的回答是/否就足够了。如果回答“否”,则提示如何在不反射(reflection)的情况下实现它。如果有帮助的话,我确实可以访问自动生成的内容的代码生成器模板。

最佳答案

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

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

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

我一直在父类中寻找问题,结果发现是构造函数的问题。将它们更改为公共(public)允许代码按预期运行,我可以使用反射来执行此操作吗?或者通过更改代码生成模板...

关于Java 在公共(public)抽象父类(super class)上反射非法访问异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423132/

相关文章:

java - 在java中使用反射调用Singleton类中的方法

java - 如何调用具有多个数组作为输入的方法?

Java类扩展了抽象类,但必须有静态方法

C++ 为什么我的类仍然是抽象的?

java - 如何使用 FileReader 类打印我正在编写的程序

java - 实现枚举值

scala - 像 $read 和 $iw 这样的奇怪名称在具体化表达式中做了什么?

c# - AppDomain 依赖解析顺序

java, 反射, 内部类,

python - 没有抽象方法的抽象类在python中创建对象