美文网首页
ClassLoader和双亲委派机制总结

ClassLoader和双亲委派机制总结

作者: allsunny | 来源:发表于2022-06-04 11:12 被阅读0次
    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() 
        }
    

    参考:

    相关文章

      网友评论

          本文标题:ClassLoader和双亲委派机制总结

          本文链接:https://www.haomeiwen.com/subject/bxmkmrtx.html