子クラスを動的に使用してプログラムにデータをインポートできるように、既存のコードを変更しようとしています。しかし、私は問題に遭遇しました。動的にインポートしようとしているクラスの 1 つに、Java が IllegalAccessError をスローする原因となる抽象親クラス フィールドにアクセスする 2 つのサブクラスが含まれています。私が抱えている問題を実証するために、小さなテストプログラムを作成しました。
呼び出しコードは、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 が呼び出されると、内部クラスを作成し、親データ フィールドにアクセスしようとし、例外がスローされます。
public class ChildClass extends 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 をロードするプログラムを実行した後にのみ発生します。