类加载就是将Java类文件从文件系统或网络中加载到JVM中,并创建对应的Java类对象的过程。
1. 加载器类型
- 引导类加载器(Bootstrap Class Loader):负责加载Java的核心类库,如java.lang包中的类等。这些类通常被JVM直接调用,因此它们的加载过程是由JVM的启动过程自动完成的。
- 扩展类加载器(Extension Class Loader):负责加载Java的扩展类库,它的父加载器是引导类加载器。通过将类路径(ClassPath)中的JAR文件和目录中的类文件加载到JVM中,扩展类加载器可以让我们使用自定义的Java类库。
- 系统类加载器(System Class Loader):又称应用类加载器(Application Class Loader),负责加载应用程序的类文件。系统类加载器可以访问扩展类加载器和引导类加载器加载的类,但反过来则不行。
2. java 类的加载过程
2.1 加载(Load)
加载是指通过类的全名获取定义此类的二进制字节流。这个过程由Java类加载器完成。它首先检查类是否已经被加载过,如果已经加载过,就返回已经加载的类;否则,从文件系统或者网络中加载类文件,并创建对应的Class对象。
2.5 验证(Verify)
验证是Java类加载过程中的一个阶段,它确保被加载的类文件的内容符合Java虚拟机的规范要求。如果验证失败,会抛出VerifyError错误。
2.3 准备(Prepare)
准备阶段是为类的静态变量分配内存,并将其初始化为默认值。
2.4 解析(Resolve)
解析是将类的符号引用转换为直接引用的过程。在Java代码中引用类、方法、变量等时使用的是符号名称,而在JVM中,需要将这些符号引用转换为具体的内存地址。这个过程在类加载的后期进行。
2.5 初始化(Initialize)
初始化阶段是执行类的初始化代码,包括静态初始化块和静态变量初始化。这个阶段是在类加载的最后进行的。
2.6 使用(Use)
开始使用这个类的实例。
2.7 卸载(Unload)
卸载并回收类的Class对象所占用的资源。