gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:46:53 25 4
gpt4 key购买 nike

我被赋予了一个抽象类:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com