![](https://img.haomeiwen.com/i24360436/6006d40817a3af9d.png)
类装载器ClassLoader
负责加载class文件,class文件在文件的开头有特定的文件标示“cafe babe”,将class文件的字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。
类加载器的种类:
1、启动类加载器(Bootstrap)C++写的
2、扩展类加载器(Extension)JAVA
3、应用程序类加载器(AppClassLoader)也叫做系统类加载器,加载当前应用的classpath下的所有类。
4、用户自定义加载器:
Java.lang.ClassLoader的子类,用户可以定制类的加载方式。
![](https://img.haomeiwen.com/i24360436/b2dd4bd47e39072c.png)
/**
* @author :yuanyong
* @date :2021/1/27 11:41
* @description:
*/
public class MyObject {
public static void main(String[] args) {
System.out.println(MyObject.class.getClassLoader());
System.out.println(MyObject.class.getClassLoader().getParent());
System.out.println(MyObject.class.getClassLoader().getParent().getParent());
}
}
****************************************************
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1b6d3586
null
BootStrapClassLoader 是一个纯的C++实现,没有对应的Java类。所以在Java中是取不到的。如果一个类的classloader是null。已经足可以证明他就是由BootStrapClassLoader 加载的
双亲委派机制:
![](https://img.haomeiwen.com/i24360436/64ca927766ca2891.png)
双亲委派机制的好处:
- 主要是为了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如String
- 同时也避免了类的重复加载,因为jvm中区分不同的类,不仅仅是根据类名,相同的class文件被不同的classloader加载就是不同的两个类。
网友评论