1 2 3 4 5 6 7 8 9 10 11
| 1,遇到new,getstatic,putstaic,invokestatic这四条字节码指令,如果类型没有进行初始化,则需要先触发其初始化阶段. 能够生成这四条指令单典型场景: 使用new关键字实例化对象的时候 读取或设置一个类型的静态字段(被final修饰,已在编译器把结果放入常量池的静态字段除外)的时候 调用一个类型的静态方法大时候. 2,使用java.lang.reflect包的方法对类型进行反射调用的时候,如果类型没有进行过初始化,则需要先触发其初始化 3,当初始化类的时候,如果发现其父类没有进行过初始化,则需要先触发其父类的初始化 4,当虚拟机启动时,用户需要制定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类. 5,当时用jdk7新加入的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic,REF_putStatic,REF_ invokeStatic,REF_newInvokeSpecial四中类型的方法句柄,并且这个方法句柄对应的类没有进行过初始化,则需要先触发其初始化. 6,当一个接口中定义了jdk8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化.
|