2

子クラスを動的に使用してプログラムにデータをインポートできるように、既存のコードを変更しようとしています。しかし、私は問題に遭遇しました。動的にインポートしようとしているクラスの 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 をロードするプログラムを実行した後にのみ発生します。

4

1 に答える 1