ClassLoader源码分析
时间20180224
//我们可以使用测试代码测试一下sun.boot.class.path的内容
System.out.println(System.getProperty("sun.boot.class.path"));
C:\Program Files\Java\jre1.8.0_151\lib\resources.jar;
C:\Program Files\Java\jre1.8.0_151\lib\rt.jar;
C:\Program Files\Java\jre1.8.0_151\lib\sunrsasign.jar;
C:\Program Files\Java\jre1.8.0_151\lib\jsse.jar;
C:\Program Files\Java\jre1.8.0_151\lib\jce.jar;
C:\Program Files\Java\jre1.8.0_151\lib\charsets.jar;
C:\Program Files\Java\jre1.8.0_151\lib\jfr.jar;
C:\Program Files\Java\jre1.8.0_151\classes
EtxClassLoader
System.out.println(System.getProperty("java.ext.dirs"));
C:\Program Files\Java\jre1.8.0_91\lib\ext;
C:\Windows\Sun\Java\lib\ext
AppClassLoader
System.out.println(System.getProperty("java.class.path"));
D:\workspace\ClassLoaderDemo\bin
以上的测试,我们知道了BoostrapClassLoader、ExtClassLoader、AppClassLoader实际是查阅相应的环境属性sun.boot.class.path、java.ext.dirs和java.class.path来加载资源文件的。
类加载器的加载顺序:
例子:
package com.classLoaderTest;
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader cl = Test.class.getClassLoader();
System.out.println("ClassLoader is :"+cl.toString());
}
}
ClassLoader is :sun.misc.Launcher$AppClassLoader@4e25154f
也就是说Test.class文件是由AppClassLoader加载的。
由于Test是我们自己编写的,有AppClassLoader加载很容易理解。那么int.class或者是String.class的加载是由谁完成的呢?
我们可以在代码中尝试
public class ClassLoaderTest {
public static void main(String[] args) {
ClassLoader cl = Test.class.getClassLoader();
System.out.println("Test ClassLoader is :"+cl.toString());
ClassLoader C2 = int.class.getClassLoader();
ClassLoader C3 = String.class.getClassLoader();
System.out.println("int ClassLoader is :"+C2.toString());
System.out.println("String ClassLoader is :"+C3.toString());
}
}
运行一下报错。
image.png
提示的是空指针,难道int.class这类基础类没有类加载器加载?
双亲委托模型
网友评论