JVM(Java虚拟机)的类加载器(ClassLoader)是Java程序中负责加载Java类文件的组件。类加载器在运行时动态地将类文件加载到JVM中,并生成对应的Class对象,使得Java程序能够使用这些类。
JVM的类加载器主要有以下几种类型:
- 引导类加载器(Bootstrap Class Loader): 引导类加载器是JVM内部的一部分,它负责加载Java平台核心库(如rt.jar、resources.jar等)。 引导类加载器是由C++实现的,不继承自ClassLoader类,所以在Java代码中无法直接引用。
- 扩展类加载器(Extension Class Loader): 扩展类加载器负责加载Java平台的扩展库(如jre/lib/ext目录下的jar包)。 它是由sun.misc.Launcher$ExtClassLoader实现的,通过Java代码可以获取该类加载器的引用。
- 应用程序类加载器(Application Class Loader): 应用程序类加载器也称为系统类加载器,负责加载应用程序的类文件。 它是由sun.misc.Launcher$AppClassLoader实现的,通过Java代码可以获取该类加载器的引用。 应用程序类加载器是默认的类加载器,所有用户自定义的类都是由它来加载。
- 自定义类加载器: 开发者可以通过继承ClassLoader类,创建自定义的类加载器。 自定义类加载器可以根据需求实现不同的加载策略,如从特定位置加载类文件、从网络加载类文件等。
类加载器采用的是双亲委派模型(Delegation Model)。即当一个类加载器接收到类加载请求时,它首先会将加载任务委托给父类加载器。 如果父类加载器无法加载该类,子类加载器才会尝试加载。这种机制保证了类的唯一性和安全性,避免重复加载和恶意替换。
类加载器在加载类文件时,会经历以下步骤:
- 加载(Loading):根据类的全限定名查找并加载字节码文件,生成对应的Class对象。
- 连接(Linking):
- 验证(Verification):验证字节码文件的正确性和安全性。
- 准备(Preparation):为静态变量分配内存并设置初始值。
- 解析(Resolution):将常量池中的符号引用替换为直接引用。
- 初始化(Initialization):执行类的初始化代码,给静态变量赋初始值。
类加载器的作用不仅限于加载类文件,还包括资源加载、动态代理、模块化等功能。开发者可以通过了解和使用类加载器来实现灵活、高效的Java程序设计。