【发布时间】:2012-06-29 22:56:53
【问题描述】:
下面的测试用例。输出:
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");
}
}
【问题讨论】:
-
为什么你认为你需要一个自定义类加载器?
-
-verbose:class命令行选项是您尝试调试类加载问题时的好帮手。 -
您的意思是要查看“自定义加载 OtherClass”吗?我会使用调试器在主类加载器中找到加载 OtherClass 的内容。
-
我需要一个自定义类加载器,因为动态加载动态创建的类。我已经知道哪个加载器在加载 OtherClass,它是父加载器。
-
是的,但是调试器会告诉你为什么它被父加载器加载,即堆栈跟踪
标签: java classloader