虚拟机严格规定,有且仅有 5 种情况必须对类进行加载:
注意,有些文章会称为对类进行“初始化”。
- 1、遇到
new
、getstatic
、putstatic
、invokestatic
这四条字节码指令时,如果类还没进行初始化,则需要先触发其初始化。 - 2、使用
java.lang.reflect
包的方法对类进行反射调用的时候,如果类还没进行初始化,则需要先触发其初始化。 - 3、当初始化了一个类的时候,如果发现其父类还没进行初始化,则需要先触发其父类的初始化。
- 4、当虚拟机启动时,用户需要指定一个执行的主类,即调用其
#main(String[] args)
方法,虚拟机则会先初始化该主类。 - 5、当使用 JDK7 的动态语言支持时,如果一个
java.lang.invoke.MethodHandle
实例最后的解析结果为 REF_getStatic、REF_putStatic、REF_invokeStatic 的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。