我正在尝试修改一些现有代码,以便能够动态使用子类将数据导入我的程序。但是我遇到了一个问题。我试图动态导入的类之一包含两个子类,它们访问导致 java 抛出 IllegalAccessError 的抽象父类字段。我写了一个小测试程序来演示我遇到的问题。
调用代码创建 URL 类加载器,加载类,然后调用 do work 方法:
URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
Class toLoad = Class.forName ("jarLoader.ChildClass", true, child);
SuperClass sc = (SuperClass) toLoad.newInstance();
sc.doWork();
Parent 类包含 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时,它会创建内部类并尝试访问父数据字段并抛出异常:package jarLoader;
公共类 ChildClass 扩展 SuperClass {
@Override
public void doWork() {
NestedClass c = new NestedClass();
c.go();
}
class NestedClass{
private void go(){
int val = a;
System.out.println(val);
}
}
}
仅在我将子类导出为 jar 并在运行时运行加载 jar 的程序后才会发生该错误。