原创

Java类加载机制

一、类的生命周期

类的生命周期
类的生命周期

加载,验证,准备,初始化,卸载这五个过程顺序是固定的。

二、类加载过程

1.加载

在加载阶段,虚拟机需要完成以下三件事情 通过一个类的全限定名来获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在 java 堆中生成一个代表这个类的 java.lang.Class 对象,作为方法区的这些数据的访问入口

2.验证

文件格式验证 元数据验证 字节码验证 符号引用验证

3.准备

类变量初始化 类变量赋值 final 准备阶段赋值 非 final,初始化时赋值

4.解析

虚拟机将常量池内的符号引用替换为直接引用。 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行。

5.初始化

初始化阶段是类加载最后一个阶段,前面的类加载阶段之后,除了在加载阶段可以自定义类加载器以外,其它操作都由 JVM 主导。到了初始阶段,才开始真正执行类中定义的 Java 程序代码。

三、类加载时机

  • new、getstatic、putstatic、invokestatic 这 4 个字节码指令时对类进行初始化(即:实例化对象、读写静态对象、调用静态方法时,进行类的初始化)
  • 使用反射机制对类进行调用时,进行类的初始化
  • 初始化一个类,其父类没有初始化时,先初始化其父类
  • 虚拟机启动时,初始化一个执行主类
  • 使用 JDK1.7 的动态语言支持时,如果 MethodHandle 实例的解析结果为 REF_getstatic、REF_putstatic、REF_invokestatic 的方法句柄(即:读写静态对象或者调用静态方法),则初始化该句柄对应类
正文到此结束