考虑以下 Java 类结构:
public class myClass {
class myInnerClass {}
}
使用命令
javac myClass.java
编译后,生成两个类文件:myClass.class
和myClass$myInnerClass.class
。
我有 2 个文件:
myClass.class
和 myClass$myInnerClass.class
在单独的
Main.java
文件中,我使用 URLClassLoader
动态加载 myClass.class
并从中执行涉及使用 myInnerClass
的方法。但是,我遇到了以下错误:
java.lang.IllegalAccessError: failed to access class myClass$myInnerClass from class myClass (myClass$myInnerClass is in unnamed module of loader 'app'; myClass is in unnamed module of loader java.net.URLClassLoader @41cf53f9)
如何解决这个问题?
我尝试在使用
classpath
时修改 module path
或 URLClassLoader
以确保正确的模块可访问性。
我希望动态加载的
myClass
能够成功访问和利用myInnerClass
,而不会遇到IllegalAccessError
。然而,尽管我尝试了,问题仍然存在。
在您的代码示例中,myInnerClass 是 myClass 的非静态内部类。您需要通过以下方式实例化它:
myClass outerObject = new myClass();
myClass.myInnerClass innerObject = outerObject.new myInnerClass();
您会得到
java.lang.IllegalAccessError
,因为您正在从不允许的上下文访问非静态内部类。您还可以将内部类设为静态,然后尝试 myInnerClass 是否不依赖于 myClass 的状态。
在此处阅读嵌套类的访问规则。