文章目录
类加载时机(5 种)
虚拟机中以下 5 种情况会触发类的首次加载
- 遇到
new
、getstatic
、setstatic
、invokestatic
字节码时 - 使用 java.lang.reflect 包的方法对类进行反射调用时
- 当加载一个类的时候,发现它的父类还未被加载,则先加载父类
- 虚拟机启动时,需要指定一个主类(带
main()
方法的类),虚拟机会先加载此类 - JDK 1.7 动态语言支持,
java.lang.invoke.MethodHandle
实例最后的解析结果是REF_getStatic
、REF_setStatic
、REF_invokeStatic
的方法句柄时,会加载对应的类
类初始化顺序
- 父类
<clinit>
块中的代码 - 子类
<clinit>
块中的代码 - 父类
<init>
块中的代码 - 子类
<init>
块中的代码
clinit 块 包含静态块与静态变量
init 块 包含成员变量与构造器