java classLoader 理解一

来源:互联网 发布:java节假日 编辑:程序博客网 时间:2024/05/01 21:31

之前一直以为 java 中类的加载器有三种 AppClassLoader, ExtClassLoader,bootStrap,当然还有自定义的classloader,自定义的classloader委托AppClassLoader,AppClassLoader委托ExtClassLoader,ExtClassLoader委托bootStrap加载Class文件. 自然而然错误的认为他们之间是父子继承关系,最近才发现不是那么回事,

来看下图,


继承关系一目了然,java程序也证明了这点:

System.out.println(DemoConfig.class.getClassLoader());System.out.println(DemoConfig.class.getClassLoader().getParent());System.out.println(DemoConfig.class.getClassLoader().getClass().getSuperclass().getClassLoader());
输出结果如下:

AppclassLoader 的父类是URLClassLoader ,但是它通过getParent()方法获得的父加载器是Extclassloader, URLClassLoader 的加载器是bootstrap.

AppclassLoader 加载 System.getProperty("java.class.path")下的class文件,Extclassloader 加载System.getProperty("java.ext.dirs")属性下的class文件,bootstrap则加载 System.getProperty("sun.boot.class.path")属性下的class文件


在来看两句程序:

System.out.println(DemoConfig.class.getClassLoader());System.out.println(DemoConfig.class.getClassLoader().getParent());System.out.println(DemoConfig.class.getClassLoader().getClass().getClassLoader());
执行的结果是:

第一句好理解,

第二句与第三句的理解容易搞混, 来理解下:

一般我们自定义的类的class 文件(在clasPath目录下)加载顺序是 AppclassLoader 先交给 Extclassloader加载,因为Extclassloader只能加载System.getProperty("java.ext.dirs")目录下的class文件,无法加载clasPath下的文件,所以Extclassloader又交给了bootstrap加载,bootsstarp同样不负责加载classpath下的文件,所以兜了一圈又交给AppclassLoader 去加载. 

DemoConfig.class.getClassLoader().getParent() 的意思是找到AppclassLoader的上一层加载器,自然就是Extclassloader
DemoConfig.class.getClassLoader().getClass().getClassLoader(); 的意思是AppclassLoader 这个class文件是有谁加载的,因为AppclassLoader这个类在rt.jar 包中,rt.jar包在  System.getProperty("sun.boot.class.path")路径下,自然是由bootstrap加载的


0 0
原创粉丝点击