java.lang.IllegalAccessError:尝试从类 Entity 访问字段 ConcreteEntity.instance

2022-09-03 17:54:30

java.lang.IllegalAccessError:尝试从类 Entity 访问字段 ConcreteEntity.instance

好吧,这就是交易。我正在尝试访问哪个字段是默认中存在的具有访问类型默认值的字段,并且是存在于子项中的方法。ConcreteEntity.instanceClassLoaderEntity.getInstanceClassLoader

现在请记住,它们都在同一个包中,但是正在抛出一个。有没有一个解决方案可以解决这个问题,不涉及我实际加载实体类与?IllegalAccessErrorClassLoaderConcreteEntity

0 new #14 <Entity>
 3 dup
 4 aload_0
 5 invokevirtual #18 <Adapter.getInstance>
 8 checkcast #20 <sl>
11 getfield #24 <sl.d>
14 invokespecial #25 <Entity.<init>>
17 areturn

通过 jclasslib 检索的字节码是“编译后”生成的异常。

谢谢甘布清理帖子。


答案 1

请参阅我对类似问题的回答,除了在您的情况下,很明显您正在处理多个类加载器:

jvm 认为从不同的类装入器装入的类位于不同的“运行时包”中,即使它们具有相同的包名称。引用jvm spceization,第5.3节:

在运行时,类或接口不是由其名称单独决定的,而是由一对确定的:其完全限定的名称和定义类装入器。每个这样的类或接口都属于一个运行时包。类或接口的运行时包由类或接口的包名称和定义类装入器确定。

在第 5.4.4 节中:

当且仅当满足以下任一条件时,类或接口 D 可以访问字段或方法 R:

...

R 要么是受保护的,要么是包私有的(即既不是公共的,也不是受保护的也不是私有的),并且由与 D 相同的运行时包中的类声明。


答案 2

Javadoc:通常,编译器会捕获此错误;仅当类的定义发生不兼容更改时,此错误才会在运行时发生。

由于我认为尝试了一些困难的类操作,也许是类加载,因此请花一些时间在如何加载这两个类上。(在极少数情况下,显式串行版本 Id 可能会有所帮助。

如果类是相关的(超/子类),则尝试使用接口删除该关系。可能使用注射。这不是两次引用/加载一个类。

对不起,我无法给出具体的答案。


推荐