Class Loading
/ / 点击 / 阅读耗时 3 分钟JVM把class文件加载的内存,并对数据进行校验、转换解析和初始化,最终形成JVM可以直接使用的Java类型的过程就是加载机制。
与那些在编译时需要进行连接工作的语言不同,在java语言里,类型的加载、连接和初始化过程都是在程序运行期间完成的。
类加载的时机
加载(装载)、验证、准备、初始化和卸载这五个阶段顺序是固定的,类的加载过程必须按照这种顺序开始,而解析阶段不一定;它在某些情况下可以在初始化之后再开始,这是为了运行时动态绑定特性。值得注意的是:这些阶段通常都是互相交叉的混合式进行的,通常会在一个阶段执行的过程中调用或激活另外一个阶段。
什么情况下需要开始类的加载?
Java虚拟机并没有强制约束,可以交给虚拟机的具体实现。但是对于初始化阶段,虚拟机规范严格要求在以下情况下必须立即对类进行”初始化“(之前的步骤也得走)
- 遇到new getstatic putstatic ivokestatic
- 使用java.lang.reflect包的方法对类进行反射调用的时候
- 调用一个类,其父类未初始化时
- 虚拟机启动时,制定的主类
- 当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果是REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所队形的类没有进行初始化。