【发布时间】: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