1

我得到了一个抽象类:

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)这个异常是因为类是抽象的而引发的吗?还是与可能的构造函数“受保护的FooPACImpl(){};”有关?

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

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

4

1 回答 1

2

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

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

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

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

于 2014-08-21T10:09:00.307 回答