过去总是喜欢看,但不怎么做实验,或者是实验做了就仍了,也不记录,结果导致:看了忘,忘了看。这回重读《深入体验Java_Web开发内幕-核心基础》,恰好提到,顺便记录一下吧。
1. 简单介绍
2. 代码实验
public class LoaderTest { /** * @param args */ public static void main(String[] args) { new LoaderTest().test(); } /** * @param args */ public void test() { ClassLoader fatherLoader = this.getClass().getClassLoader(); System.out.println("当前类的父加载器名称:" + fatherLoader.getClass().getName()); // 这是因为AppClassLoader的父加载器虽然是ExtClassLoader,但是却是Bootstrap // 加载的(所以它的.getClassLoader()返回为null) // Bootstrap、 ExtClassLoader、 AppClassLoader的关系很符合中国过去,可以这么描述:ExtClassLoader是AppClassLoader的爸爸,但是AppClassLoader确实他爷爷Bootstrap一把屎一把尿喂大的。 System.out.println("AppClassLoader的直接加载器是null吗:" + (fatherLoader.getClass().getClassLoader() == null)); ClassLoader grandfatherLoader = fatherLoader.getParent(); System.out.println("爷爷载器名称:" + grandfatherLoader.getClass().getName()); } }
代码运行结果:
3. 类加载器各自搜索的目录
1.Bootstrap Loader(启动类加载器):加载System.getProperty("sun.boot.class.path")所指定的路径或jar。通过System.out.println(System.getProperty("sun.boot.class.path"));打印,发现主要是“D:\Program Files\Java\jdk1.6.0_10\jre\lib”中的jar包。
2.Extended Loader(标准扩展类加载器ExtClassLoader):加载System.getProperty("java.ext.dirs")所指定的路径或jar。在使用Java运行程序时,也可以指定其搜索路径,例如:java -Djava.ext.dirs=d:\projects\testproj\classes HelloWorld。
通过打印System.out.println(System.getProperty("java.ext.dirs"));,可以发现主要加载目录为:
“D:\Program Files\Java\jdk1.6.0_10\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext”
参考:
http://hi.baidu.com/haifengjava/blog/item/498fd8365ef5c8390a55a9db.html
http://lavasoft.blog.51cto.com/62575/184547
…………