JVM类加载的时机

虚拟机规范中使用了一个很强烈的限定词:“有且仅有” 以下五种场景才会对一个类进行主动引用,触发其初始化的操作。
1.遇到new、getstatic、putstatic、invoiikestatic、这4条字节码指令,如果类没有进行过初始化,则需要先触发其初始化。对应的4个常见场景:使用new实例化对象;读取、设置一个类的静态字段;调用类的静态方法。
2.使用java.lang.reflect方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
3.当初始化一个类的时候,发现其父类没有进行过初始化,则先触发父类的初始化。
4.当虚拟机启动时,虚拟机会先初始化用户指定的主类(main方法所在的类)
5.当使用JDK1.7动态语言支持时,如果MethodHandle实例最后的解析结果的方法句柄对应的类没有进行过初始化,则先触发其初始化(这条不懂)

除了这五种情况以外,所有引用类的方法都不会触发初始化。

注意:

  • 对于静态字段,只有直接定义这个字段的类才会被初始化。
  • 通过数组定义引用类,不会触发此类的初始化
  • 常量在编译阶段会存入调用类的常量池,因此不会触发定义类的初始化。

你可能感兴趣的:(JVM类加载的时机)