java.lang.IllegalAccessError:尝试从动态加载的子类的内部类访问父类中的字段
我正在尝试修改一些现有代码,以便能够动态地使用子类 将数据导入我的程序。然而,我遇到了一个问题。我试图动态导入的一个类包含两个子类,它们访问抽象父类字段,导致java抛出IllegaAccessError。我已经编写了一个小测试程序来演示我遇到的问题 调用代码创建URL类加载器,加载类,然后调用do work方法:java.lang.IllegalAccessError:尝试从动态加载的子类的内部类访问父类中的字段,java,dynamic-class-loaders,illegalaccessexception,Java,Dynamic Class Loaders,Illegalaccessexception,我正在尝试修改一些现有代码,以便能够动态地使用子类 将数据导入我的程序。然而,我遇到了一个问题。我试图动态导入的一个类包含两个子类,它们访问抽象父类字段,导致java抛出IllegaAccessError。我已经编写了一个小测试程序来演示我遇到的问题 调用代码创建URL类加载器,加载类,然后调用do work方法: URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
Class toLoad = Class.forName ("jarLoader.ChildClass", true, child);
SuperClass sc = (SuperClass) toLoad.newInstance();
sc.doWork();
父类包含3个int字段和一个抽象方法:
package jarLoader;
public abstract class SuperClass {
protected int a = 1;
protected int b = 2;
protected int c = 3;
public SuperClass(){
}
public abstract void doWork();
}
调用do work时,子类将创建内部类并尝试访问父数据场,并引发异常:
包装加载器
公共类ChildClass扩展了超类{
@Override
public void doWork() {
NestedClass c = new NestedClass();
c.go();
}
class NestedClass{
private void go(){
int val = a;
System.out.println(val);
}
}
}
只有在我将子类导出为jar并在运行时运行加载jar的程序后,才会发生错误。
该关键字是一个访问修饰符,在方法或其他类成员之前使用,表示该方法或变量只能由驻留在同一包中自己的类或类中的元素访问(与默认可见性级别相同),而且可以从自己类的子类访问,包括外部包中的子类(如果对类型为该子类类型的表达式进行访问)
从jar加载后,它实际上扩展了父类的一个副本(据我所知),因此它无法访问真实父类的受保护元素。您是否尝试过将a设置为public或创建public getter?我怀疑您的一个类被两个不同的类加载器加载了两次。(但Java内部类无论如何都是一种黑客行为,所以它可能只是一个bug,呃,“feechure”。)