Thread t = new Thread() {
public void run() {
try {
Class.forName("test.User");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("child thread:"
- Thread.currentThread().getContextClassLoader()); } }; t.setContextClassLoader(null); t.start(); 我在这个线程启动之前把context类加载器设置为bootstrap了,那么run方法第一句加载test。User为什么会成功呢?bootstrap加载器没有父加载器了,它尝试加载User类,而这个类是我自己写的,不是在rt.jar中的,那么为什么会成功加载呢?User类不应该由应用加载类加载的吗?
2.还有一个问题,是core java下册中的内容,我不清楚是不是译者的翻译没有到位的问题,他说:
偶尔,你也会需要干涉和指定类加载器,考虑下面的例子:
*你的应用代码包含一个助手方法,他要调用Class.forName(classNameString)
*这个方法是从一个插件类中被调用的。
*而classNameString指定的正是一个包含在这个插件的jar中的类。
我想象的代码结构可能是这样的。
Class Test{
main(){
Util.foo();
}
}
class Util{
public static void foo(){
Class.forName(classNameString);
}
}
然后他说,插件的作者很合理的期望这个类应该被加载,但是,助手方法的类是由系统类加载器(即应用类加载器)加载的。这正是Class.forName所使用的类加载器。而对于他来说,在插件JAR中的类是不可视的,这种现象称为类加载器倒置。
我最后一句话没读懂,如果在eclipse下把插件的jar build进来,不就可以访问到插件中的类了吗?为什么要干涉和指定类加载器?