下面的测试用例。输出:
custom loading of: pkg.TestRun
ran.
wish this would run in my custom classloader
我想要发生的是在输出的第二行和第三行之间看到“自定义加载:pkg.TestRun”。
我怎样才能让它从我的自定义类加载器加载一个类的依赖项,即使第一个类是从父类加载的?请注意,在我的真实案例中,我得到了一个找不到类的异常,因为父类加载器不知道 OtherClass 的等价物。
我知道一种解决方案是让自定义类加载器显式加载 TestRun。但是,如何加载 TestRun 已为父类加载器所知,我不想单独管理查找它,因为它已经完成,而且我可能很难以某种方式弄清楚它何时已经在没有我做的情况下进行管理任何事物。而且我尝试过类似 super.getResource (返回 null)或 findClass (已经将 parent 设置为它的类加载器)之类的东西,但都没有奏效。
那么,我可以让父类找到类,但自定义加载器定义它吗?或者,有没有办法让它总是使用我的自定义加载器来查找依赖项?
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");
}
}