【问题标题】:Java reflect illegalAccessException on public abstract super classJava在公共抽象超类上反映了非法访问异常
【发布时间】:2014-10-14 21:33:01
【问题描述】:

我得到了一个抽象类:

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 中的反射不能直接处理“公共抽象”超类?

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) 而且,这甚至可以实现吗?我的理解是,如果您将 AA 与 BB 子类化,则可以在预期 BB 的地方使用 AA,因为 BB 将具有预期 AA 具有的任何内容(方法、字段等)。虽然,已经有一段时间了。我可能对java中继承的细节有点模糊。

感谢任何点/指针,对#3 的回答是/否就足够了。在“否”的情况下,暗示如何在没有反思的情况下实施它。如果有帮助,我确实可以访问自动生成内容的代码生成器模板。

【问题讨论】:

  • 如果您可以提供一个简短但完整的示例来演示该问题,这将有所帮助 - 理想情况下也可以使用传统的类名......
  • 错误提到了一个类 foo.bar.fnorb.ServiceSupport,这是您尝试进行实例化的类吗?
  • 我认为如果类 foo.bar.baz.myReqTypeFooPAC 的构造函数受到保护,则可能会发生此错误。您提到该类是公共的,但它的构造函数可能受到保护。
  • @KoenWeyn :你成功了——类是公开的,子类的 ctor 是受保护的。正确,ServiceSupport 是我在其中进行反射的类。
  • @JonSkeet :传统类名的本地定义是什么?

标签: java reflection abstract-class illegalaccessexception


【解决方案1】:

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

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

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

我在父类中寻找问题,但结果是构造函数的问题。将它们更改为公共允许代码按预期运行,我可以使用反射来做到这一点吗?或通过更改代码生成模板...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多