Java类加载全流程解析 2

53 阅读2分钟

Java类加载全流程解析 2

Java类加载全流程解析 2

回答

  • Java中类的加载阶段分为加载(Loading)、链接(Linking)和初始化(Initialization)。

image-20250329115506346

1、加载阶段
  1. 加载目的:是将类的 .class文件 加载到 JVM 中

  2. 加载过程:会创建一个 java.lang.Class 类的实例来表示这个类。

    这个Class对象作为程序中每个类的数据访问入口。

2、链接阶段
  1. 验证:校验类的正确性(文件格式,元数据,字节码,二进制兼容性),保证类的结构符合JVM规范。
  2. 准备:为类变量分配内存并设置类变量的默认初始值,这些变量使用的内存都在方法区中分配。(这里初始化的是类变量,即static字段,实例变量会在对象实例化时随对象一起分配在Java堆中。)
  3. 解析:把类的符号引用转为直接引用 (类或接口、字段、类方法、接口方法、方法类型、方法句柄和访问控制修饰符7类符号引用 )
3、初始化阶段
  • 初始化的本质基于懒加载思想,仅在类首次主动使用时初始化。

  • 初始化的触发场景

    1. 字节码指令触发

      new(创建类实例)、

      getstatic(读取未被 final 修饰的静态字段)、

      putstatic(设置静态字段值)、

      invokestatic(调用静态方法)

    2. 反射触发

      通过 java.lang.reflect 包反射调用类,若类未初始化则触发。

    3. 父类初始化优先

      初始化子类时,若父类未初始化,先触发父类初始化。

    4. 虚拟机启动主类

      程序启动时,含 main 方法的主类会被初始化。

    5. JDK 1.7 动态语言场景

      MethodHandle 实例最终解析为 REF_getStaticREF_putStaticREF_invokeStatic 类型的方法句柄,且句柄未初始化时,触发类初始化。