虚拟机类加载机制:把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。
在Java语言里面,类型的加载、连接和初始化都是在程序运行期间完成的。
类加载的时机
类的整个生命周期包括:加载(loading)、验证(verification)、准备(preparation)、解析(resolution)、初始化(initialization)、使用(using)和卸载(unloading) 7个阶段。其中 验证、准备、解析 3个部分统称连接(linking)。
5种必须立即初始化的情况:
- 遇到new, getstatic, putstatic 或 invokestatic 这4挑字节码指令;
- 使用 java.lang.reflect 包的方法对类进行反射调用;
- 初始化一个类的时候,其父类还没有初始化,必须先触发其父类的初始化;(对于接口,只有在真正用到其父接口的时候才会初始化)
- 虚拟机启动时,用户指定要执行的主类;
- 当使用 JDK 1.7 的动态语言支持时,如果一个 java.lang.invoke.MethodHandle 实例最后的解析结果 REF_getStatic, REF_putStatic, REF_invokeStatic 的方法句柄,并且这个方法句柄锁对应的类没有进行出事,则需要先触发其初始化。
对于静态字段,只有直接定义这个字段的类才会被初始化。
继续阅读