前言
Java虚拟机(JVM)的类加载器(ClassLoader)负责将类的字节码加载到内存中,并将其转换为运行时的类。类加载器在Java中有不同的分类,而双亲委派机制是一种类加载器之间的协作机制,用于保证类的唯一性和安全性。
1. 类加载器的分类:
1.1 启动类加载器(Bootstrap ClassLoader):
这是Java虚拟机的一部分,用于加载Java的核心类库,如java.lang
包中的类。它是JVM的一部分,通常用本地代码来实现,不是Java类。
1.2 扩展类加载器(Extension ClassLoader):
负责加载Java的扩展类库,位于java.ext.dirs
系统属性所指定的目录中。通常是<JAVA_HOME>/lib/ext
目录。
1.3 应用程序类加载器(Application ClassLoader):
也被称为系统类加载器,负责加载应用程序classpath下的类。它是ClassLoader类的子类,通常由Java虚拟机的实例化进程实例化。
1.4 自定义类加载器:
开发者可以通过继承ClassLoader类来自定义类加载器,实现自己的加载逻辑。这样的类加载器被称为用户自定义类加载器。
2. 双亲委派机制:
双亲委派机制是一种层次化的类加载器结构,保证类的唯一性和安全性。当一个类加载器收到加载类的请求时,它首先会检查这个类是否已经被加载过,如果已经加载过,就直接返回该类的Class对象;如果未加载过,它会将请求委派给父类加载器去加载,一直向上委派,直到到达启动类加载器。
作流程如下:
- 当一个类加载器收到加载类的请求时,先检查该类是否已经加载。
- 如果已加载,直接返回Class对象。
- 如果未加载,将加载请求委派给父类加载器。
- 父类加载器按照同样的方式继续检查,直到到达启动类加载器。
- 如果启动类加载器无法加载该类,子类加载器尝试自己加载类。
- 如果子类加载器加载成功,返回Class对象;如果失败,报ClassNotFoundException。
这种机制的好处是避免了重复加载,确保类的唯一性,同时也提高了安全性,防止恶意类的加载。
自定义类加载器时,通常需要重写findClass
方法来实现自己的加载逻辑,同时可以选择是否破坏双亲委派机制。