【发布时间】:2011-09-16 00:21:17
【问题描述】:
假设我有三个类,example.ClassA、example.ClassB 和 example.ClassLoader。 ClassA 打印出 HelloWorld 并且 ClassB 导入 example.ClassA 并调用它的 main() 方法。如果我这样做:
java -cp Example.jar -Djava.system.class.loader=example.ClassLoader example.ClassA
它可以工作并使用我的类加载器。但是,如果我这样做:
java -cp Example.jar -Djava.system.class.loader=example.ClassLoader example.ClassB
ClassB 使用我的类加载器,但 ClassA(由 ClassB 导入)是使用默认类加载器加载的。
有什么方法可以强制 Java 始终使用我的类加载器(除非明确指定另一个类加载器)?
编辑:感谢 Paŭlo Ebermann 在下面的回答,我认为问题是我正在调用父类加载器 (URLClassLoader) 来加载我不需要触摸的类,并且那些加载的类将其设置为上下文类加载器,因此从它导入的类使用我的自定义加载器的父类加载器。 (令人困惑,抱歉)现在我可以通过手动读取每个类来让它工作,但是这似乎是多余的,因为我直接复制了 URLClassLoader 的代码。有没有办法告诉父类加载器查找和定义类,但将类的上下文类加载器设置为您的自定义类加载器?
【问题讨论】:
-
加载的类没有将父类设置为它们的“上下文”类加载器。父类是加载类的物理“文件”加载器,这就是为什么这些类使用父类来进一步加载它们需要的依赖项。请参阅stackoverflow.com/a/25489403/632951 了解更多信息。
标签: java class classloader