Java类的加载过程包括以下几个阶段:
- 加载(Loading):
- 这个阶段JVM会读取 class 文件,并将其数据结构加载到 JVM 中,然后生成一个对应的 Class 对象。
- 类加载器(ClassLoader)负责这个阶段,JVM提供了三个系统类加载器:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。
- 验证(Verification):
- JVM会验证 class 文件是否符合 JVM 规范,包括文件格式、字节码指令、符号表、 Constant Pool 等是否合法。
- 这一步骤确保了 class 文件的安全性和正确性。
- 准备(Preparation):
- JVM为类变量(static 变量)分配内存,并设置默认初始值。
- 这些变量所使用的内存都在方法区中进行分配。
- 解析(Resolution):
- 这个阶段JVM将类、接口、字段和方法的符号引用转换为直接引用。
- 符号引用是指在 class 文件中出现的对类、接口、字段和方法的引用,而直接引用是指指向方法区的指针、偏移量或者是指向对象的引用。
- 初始化(Initialization):
- 这个阶段JVM会执行类的初始化代码,包括执行类构造器
<clinit>()
方法。 - 这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。
- 当初始化一个类的时候,如果其超类还没有进行初始化,则需要先触发其超类的初始化。
- 加载完成(Loading Complete):
- 经过以上阶段,一个类就被成功地加载、验证、准备、解析和初始化,此时它可以被 JVM 使用。
以上六个阶段是Java类加载的主要过程,它们确保了类的正确性和安全性,并为类的运行做了必要的准备。