JVM的类加载器是负责将类的字节码加载到JVM中的组件。它的主要功能是根据类的全限定名,从文件系统、网络、ZIP包等位置加载字节码,并将其转换为JVM内部的Class对象。
类加载器有以下三种类型:
1. 引导类加载器(Bootstrap Class Loader):引导类加载器是JVM内置的类加载器,它负责加载Java核心库(如java.lang包中的类)。引导类加载器是JVM的一部分,由C++实现,并不是一个普通的Java对象。
2. 扩展类加载器(Extension Class Loader):扩展类加载器负责加载Java扩展库(如javax包中的类),位于sun.misc.Launcher$ExtClassLoader类中。
3. 应用程序类加载器(Application Class Loader):应用程序类加载器也称为系统类加载器,负责加载应用程序类路径(Classpath)上指定的类。它是ClassLoader类的子类,位于sun.misc.Launcher$AppClassLoader类中。
除了上述三种核心类加载器,还可以根据需要创建自定义的类加载器。自定义类加载器可以继承ClassLoader类,重写父类的方法来实现特定的类加载需求,例如从非标准位置加载类文件、加载加密的类文件等。
类加载器采用双亲委派模型(Parent Delegation Model)来保证类的隔离性和安全性。即当一个类加载器收到类的加载请求时,它会先查询父加载器是否已经加载了该类,如果父加载器能够加载,则将加载过程委派给父加载器进行处理,只有在父加载器无法加载时,才由当前加载器自己来加载。这样可以确保类的一致性,并防止同名类的冲突。
类加载器的执行流程:
- 加载(Loading):类加载器负责查找、读取并加载类的字节码文件到内存中。加载过程是通过类的全限定名(Fully Qualified Name)来定位并读取对应的字节码文件。
- 链接(Linking):链接是指将已加载的类与其他类或符号进行关联的过程。链接包括三个阶段:
- 验证(Verification):验证确保被加载的类的字节码符合Java语言规范和安全约束,防止恶意代码的执行。
- 准备(Preparation):准备阶段为类的静态变量分配内存空间,并设置默认初始值。
- 解析(Resolution):解析阶段将类或接口的符号引用替换为直接引用,以便于在运行时进行访问。
- 初始化(Initialization):初始化是类加载的最后一个阶段,它负责执行类的静态初始化代码块(static块)和静态变量的赋值操作。在该阶段,JVM会保证一个类的初始化操作只会执行一次,确保类的静态状态的正确性。