Java类加载过程是指将类的字节码文件加载到Java虚拟机(JVM)中并转换为可执行的Java类的过程。Java类加载器(ClassLoader)负责类加载,并按照特定的规则和顺序完成以下步骤:
1. 加载(Loading):类加载的第一阶段是加载类的字节码文件。通过类的全限定名(包括包路径)找到类的字节码文件,并将其读取到内存中。
2. 验证(Verification):在验证阶段,对加载的字节码进行各种验证以确保其正确性和安全性。验证过程包括字节码的格式验证、语义验证、操作数校验等。
3. 准备(Preparation):在准备阶段,为类中的静态变量分配内存空间并设置默认初始值。这些变量包括静态变量和静态常量。
4. 解析(Resolution):在解析阶段,将符号引用转换为直接引用。符号引用指的是用符号表示的方法、字段、类等,而直接引用是内存地址的指针。
5. 初始化(Initialization):在初始化阶段,执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。当类被首次主动使用时,即触发初始化,而被动使用(如引用常量)不会触发初始化。
6. 使用(Usage):在类加载完成后,可以使用类来创建对象、调用方法等。
7. 卸载(Unloading):当类不再被引用、程序结束或者类的加载器被回收时,类可能会被卸载(从内存中移除)。
值得注意的是,Java类加载过程是按需加载的,即在程序运行时根据需要动态加载类。类加载器根据类的引用关系、访问路径和配置进行类的加载和链接。
此外,Java中有三种内置的类加载器:
1. Bootstrap ClassLoader:负责加载Java的核心类库,如`java.lang`等。它是虚拟机的一部分,是用本地代码实现的,不继承自`java.lang.ClassLoader`。
2. Extension ClassLoader:负责加载Java的扩展类库,即`jre/lib/ext`目录下的类库。它是由 `sun.misc.Launcher$ExtClassLoader` 实现的。
3. Application ClassLoader:也称为 System ClassLoader,负责加载应用程序中的类。它是由 `sun.misc.Launcher$AppClassLoader` 实现的,是用户自定义的类加载器。
这些类加载器按照父子关系形成了类加载器层次结构,可以根据需要自定义类加载器以实现特定的加载需求。
这是Java类加载过程的基本概述。类加载是Java虚拟机的重要组成部分,它使得动态加载和扩展成为可能,并提供了灵活性和可控性。