当前位置: 首页 > 知识库问答 >
问题:

Java在公共抽象超类上反映illegalAccessException

司寇嘉茂
2023-03-14

我得到了一个抽象类:

public abstract FooPACImpl {
    ...
}

和两个自动生成的子类:

public replyTypeFooPAC extends FooPACImpl {
    ...
}
public requestTypeFooPAC extends FooPACImpl {
    ...
}

以及一个用于创建网络模式(请求/回复)的应用编程接口,该html" target="_blank">模式使用请求类型和回复类型(A和B预计将像上述那样是自动生成的FOPACImpl子类):

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

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

感谢您提供的任何意见/建议,对#3的回答是/否就足够了。在“否”的情况下,提示如何在没有反射的情况下实现它。如果有帮助的话,我可以访问自动生成的代码生成器模板。

共有1个答案

邹斌
2023-03-14

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

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

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

我在父类中寻找问题,但结果是构造函数的问题。将这些更改为公共允许代码按预期运行,我可以使用反射?或者通过更改codegen模板...

 类似资料:
  • 嗨,我有一个抽象类,其中有一些公共方法和一些抽象方法。我让公众知道,他们实现了派生类的通用方法。 让我困惑的是,为什么我想定义一个公共抽象方法,而不是受保护的抽象方法。在抽象类中定义公共抽象方法对我来说毫无意义。。。。因为if是一个抽象,在派生类中会被重写,但if被定义为public也是一样的,但在某种程度上,将其定义为protected更有意义,因为我们知道,我们将在派生类中重写它。 在抽象类中

  • 问题内容: 我有一个包含带有抽象超类的JAXB注释类的程序包。我想在Web服务接口中使用此超类,因此可以将任何子类作为参数传递。当我这样做时,会引发异常: 可以手动将marshall / unmarshall&参数作为字符串传递,但我想避免这种情况。有什么想法怎么做? 问题答案: 您是否在Web服务请求中指定了具体的实现?这对我来说很好: 抽象基类: 实现类: Web服务方法: 请求:

  • 问题内容: 我的数据模型代表法人实体,例如企业或个人。两者都是纳税实体,都具有TaxID,电话号码和邮件地址的集合。 我有一个Java模型,其中有两个扩展抽象类的具体类。抽象类具有两个具体类共有的属性和集合。 我正在 MySQL* 数据库上使用 Hibernate JPA注释,其类如下: * 问题是,和对象需要参考他们的主人,这是一个。hibernate抱怨: 看来这将是一个相当普遍的Java继承

  • 问题内容: 在使用Hibernate和MySQL的Spring MVC应用程序中,我有一个抽象超类,该超类管理模型中所有其他实体的ID值。该字段使用。每当我的代码尝试保存任何扩展的子类时,我都会遇到问题。这个问题带有的选择了。 在我的代码中试图将子类保存到底层MySQL数据库的每个位置,都会出现以下错误: 我已经在SO和google上阅读了很多关于此的文章,但是它们要么处理其他数据库(不是MySQ

  • 问题内容: 假设有一个 抽象 类say 和两个非抽象子类say 和。我想通过使用GSON库从json格式“反序列化”它们。 例如,我得到一个对象数组。 有人将其转换为JSON字符串,如下所示: 最后,如果我尝试如下反序列化 那么我就遇到了一个错误,因为GSON默认的反序列化器找到了一个抽象类(即),并且它无法猜测子类的类型。 我该如何解决? PS:我阅读了有关自定义反序列化器的信息,但在这种情况下

  • 假设有一个抽象类,例如和两个非抽象子类,例如和。我想使用GSON库从json格式“反序列化”它们。 例如。我得到一个对象的数组。 有人将其转换为JSON字符串,如下所示: 最后,如果我尝试反序列化如下 然后我有一个错误,因为GSON默认反序列化器找到一个抽象类(即)并且它无法猜测子类类型。 我如何解决这个问题? PS:我读过关于自定义反序列化器的文章,但我不明白如何在这种情况下使用它们。