链接阶段分为验证、准备、解析三步:验证确保字节码安全合规;准备为静态变量分配内存并设零值(static final编译期常量除外);解析将符号引用转为直接引用,部分可延迟至首次使用。

Java 类加载过程中的链接(Linking)阶段,是把已加载的类二进制数据整合进 JVM 运行时状态的关键环节,它分为三个明确的子阶段:验证、准备、解析。
验证(Verification)
这是链接的第一步,核心目标是确保类文件安全合规。JVM 会逐层检查字节码:
- 文件格式验证:确认魔数(0xCAFEBABE)、主次版本号是否合法;
- 元数据验证:检查语义是否符合 Java 规范,比如是否继承了 final 类、是否重写了不可覆盖的方法;
- 字节码验证:分析方法体内的指令流,确保操作数栈与局部变量表类型匹配、跳转不会越界;
- 符号引用验证:提前检查常量池中对其他类、字段、方法的引用是否存在且可访问(为后续解析做铺垫)。
准备(Preparation)
该阶段为类的静态变量(即被 static 修饰的变量)分配内存,并设置初始值。注意:
- 初始值是数据类型的零值(如 int 设为 0,reference 设为 null),不是代码中写的显式值;
- 唯一例外是被 static final 修饰的编译期常量(如
static final int PORT = 8080;),这类变量在准备阶段就直接赋值为 8080; - 实例变量不在此阶段处理,它们随对象实例化在堆中分配。
解析(Resolution)
解析的任务是把常量池内的符号引用(Symbolic References)转换为直接引用(Direct References)。例如:
- 将类名、字段名、方法名等字符串形式的描述,替换成内存中具体的位置指针(如方法区里的地址);
- 包括类或接口的解析、字段解析、类方法解析、接口方法解析等;
- 解析不一定全部在初始化前完成,某些场景(如动态绑定)允许延迟到首次使用时再解析。
这三个步骤共同构成链接阶段,确保类在进入初始化前结构正确、内存就绪、引用可达。


















