ClassLoader加载时资源搜索路径

JVM是通过一个称为ClassLoader东西来加载Class文件的,每当JVM启动,它就会生成三个ClassLoader,它们分别是Bootstrap Loader, ExtClassLoader 和AppClassLoader。这三个ClassLoader作用是不同的,它们所加载的class文件也是不同的。

Bootstrap Loader

Bootstrap Loader是用C++语言实现的,它所加载的是JVM中最底层的类,它加载时的搜索路径是由sun.boot.class.path所指定的。

System.out.println(System.getProperty("sun.boot.class.path"));

输出结果如下:
/home/taomk/opt/jdk1.7.0_51/jre/lib/resources.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/rt.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/sunrsasign.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jsse.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jce.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/charsets.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jfr.jar:
/home/taomk/opt/jdk1.7.0_51/jre/classes

ExtClassLoader

ExtClassLoader是用来加载java的一些库的,它加载时的搜索路径是由java.ext.dirs来决定的,该加载器在加载时不同于其他加载器,它加载时会搜索指定路径下的所有子目录,也就是说它会搜索java.ext.dirs所指定下的所有子目录下的class文件或jar文件。同时也可以用参数-Djava.ext.dirs来改变它的搜索路径。

System.out.println(System.getProperty("java.ext.dirs"));

输出结果如下:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext:
/usr/java/packages/lib/ext

AppClassLoader

AppClassLoader也称System ClassLoader, 它的搜索路径是由java.class.path来指定的,而且要注意AppClassLoader不会搜索java.class.path下的子目录的。

System.out.println(System.getProperty("java.class.path"));

输出结果如下:

/home/taomk/opt/jdk1.7.0_51/jre/lib/jce.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/resources.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/deploy.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jfxrt.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/javaws.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jsse.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/rt.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/management-agent.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/plugin.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/charsets.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/jfr.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/sunec.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/localedata.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/zipfs.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/dnsns.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/sunjce_provider.jar:
/home/taomk/opt/jdk1.7.0_51/jre/lib/ext/sunpkcs11.jar:

ExtClassLoader 和AppClassLoader在JVM中只会存在一个实例,一旦运行了是无法改变它们的搜索路径的,也就是无法在程序中通过调用System.setProperty()来改变java.class.path或java.ext.dirs来改变它们的搜索路径的。

你可能感兴趣的:(ClassLoader加载时资源搜索路径)