JAVA类加载机制,1.9之前

全盘负责:当一个类加载器加载某个Class时,该Class所依赖和引用的其它Class也将由该类加载器负责载入,除非显式的使用另外一个类加载器来载入。

双亲委派:当一个类加载器收到了类加载请求,会先看看自己的缓存中是否已经加载了该类,如果加载了就直接返回,否则它会把这个请求委派给父类加载器parent去完成,依次递归,因此所有的加载请求最终都被传送到顶层的启动类加载器中。只有在父类加载器无法加载该类时子类才尝试从自己类的路径中加载该类。(注意:类加载器中的父子关系并不是类继承上的父子关系,而是类加载器实例之间的关系)

作用:

沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心 API库被随意篡改

避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一 次,保证被加载类的唯一性

   如何打破双亲委派机制

定义一个类继承ClassLoader,重写loadClass和findClass方法

缓存机制:缓存机制会保证所有加载过的Class都会被缓存,当程序中需要使用某个类时,类加载器先从缓冲区中搜寻该类,若搜寻不到将读取该类的二进制数据,并转换成Class对象存入缓冲区中。这就是为什么修改了Class后需重启JVM才能生效的原因

 

类加载器和双亲委派机制(如何找到class文件并加载的)

String.class.getClassLoader()  返回null,引导类加载器负责加载String类进jvm,是由c++实现的

sun.misc.Launcher$ExtClassLoader

猜你喜欢

转载自blog.csdn.net/qq_33436466/article/details/108462083