-
类加载器(ClassLoader)
- 启动类加载器(Bootstrap ClassLoader)
- 扩展类加载器(Extension ClassLoader)
- 应用程序类加载器(Application ClassLoader)
每个类加载器都有一个父加载器(parent);
父加载器不是父类,可以用getParent()获取;
-
如果一个ClassLoader创建时如果没有指定parent,那么它的parent默认就是AppClassLoader;
- AppClassLoader的parent是ExtClassLoader;
- ExtClassLoader的parent是null;
-
Bootstrap ClassLoader
Bootstrap ClassLoader是由C/C++编写的,它本身是虚拟机的一部分,所以它并不是一个JAVA类,也就是无法在java代码中获取它的引用,JVM启动时通过 Bootstrap类加载器加载rt.jar等核心jar包中的class文件,int.class,String.class都是由它加载。Bootstrap没有父加载器,但是它却可以作为一个ClassLoader的父加载器,比如ExtClassLoader。
如果要把加载请求委派给Bootstrap ClassLoader,那直接使用null代替即可;
-
双亲委派机制
- 当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
- 当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
- 如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
- 若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
- 双亲委派机制可以保证安全性,防止系统类被伪造
加载Class过程,委托是从下向上,然后具体查找Class过程却是自上至下。(loadClass()方法的代码实现)
findClass()
// 查找class并加载;
findClass(){
// 将class二进制内容转换成Class对象
defineClass()
}
参考:
- https://blog.csdn.net/Chen4852010/article/details/122546415
- 《深入理解Java虚拟机 第二版》