以下のテストケース。出力:
custom loading of: pkg.TestRun
ran.
wish this would run in my custom classloader
私がしたいのは、出力の 2 行目と 3 行目の間に「pkg.TestRun のカスタム読み込み」が表示されることです。
最初のクラスが親からロードされた場合でも、カスタム クラスローダーからクラスの依存関係をロードするにはどうすればよいですか? 私の実際のケースでは、 OtherClass に相当するものが親クラスローダーに認識されていないため、クラスが見つからないという例外が発生することに注意してください。
解決策の 1 つは、カスタム クラス ローダーで TestRun を明示的にロードすることです。ただし、TestRun をロードする方法は親クラスローダーに既に知られているため、個別に検索を管理する必要はありません。それは既に行われているためです。私が何もせずに既に管理されている場合、どうにかしてそれを理解するのは難しいかもしれません。なんでも。そして、私はsuper.getResource(nullを返す)やfindClass(すでに親をクラスローダーとして設定しています)のようなことをしようとしましたが、どちらもうまくいきませんでした。
では、親にクラスを見つけさせて、カスタム ローダーに定義させることはできますか? または、常にカスタムローダーを使用して依存関係を探すようにする方法はありますか?
package pkg;
public class TestCL {
static class MyCL extends ClassLoader {
MyCL(ClassLoader parent) {
super(parent);
}
@Override
public Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
System.out.println("custom loading of: " + name);
return getParent().loadClass(name);
}
}
public static void main(String[] args) throws Exception {
MyCL cl = new MyCL(Thread.currentThread().getContextClassLoader());
Thread.currentThread().setContextClassLoader(cl);
cl.loadClass("pkg.TestRun").getMethod("run", new Class[] {}).invoke(null);
}
}
class TestRun {
public static void run() {
System.out.println("ran.");
OtherClass.runAlso();
}
}
class OtherClass {
public static void runAlso() {
System.out.println("wish this would run in my custom classloader");
}
}