ClassLoader和双亲委派机制总结

  1. 类加载器(ClassLoader)

    • 启动类加载器(Bootstrap ClassLoader
    • 扩展类加载器(Extension ClassLoader
    • 应用程序类加载器(Application ClassLoader
  2. 每个类加载器都有一个父加载器(parent)

  3. 父加载器不是父类,可以用getParent()获取;

  4. 如果一个ClassLoader创建时如果没有指定parent,那么它的parent默认就是AppClassLoader

    • AppClassLoader的parent是ExtClassLoader
    • ExtClassLoader的parent是null
  5. Bootstrap ClassLoader

    Bootstrap ClassLoader是由C/C++编写的,它本身是虚拟机的一部分,所以它并不是一个JAVA类,也就是无法在java代码中获取它的引用,JVM启动时通过 Bootstrap类加载器加载rt.jar等核心jar包中的class文件,int.class,String.class都是由它加载。Bootstrap没有父加载器,但是它却可以作用一个ClassLoader的父加载器,比如ExtClassLoader。

如果要把加载请求委派给Bootstrap ClassLoader,那直接使用null代替即可;

  1. 双亲委派机制

    1. 当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
    2. 当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
    3. 如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
    4. 若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
    5. 双亲委派机制可以保证安全性,防止系统类被伪造
  2. 加载Class过程,委托是从下向上,然后具体查找Class过程却是自上至下。(loadClass()方法的代码实现)

  3. findClass()

// 查找class并加载;
    findClass(){
        // 将class二进制内容转换成Class对象
       defineClass() 
    }

参考:

  • https://blog.csdn.net/Chen4852010/article/details/122546415
  • 《深入理解Java虚拟机 第二版》

你可能感兴趣的:(ClassLoader和双亲委派机制总结)