简明概述:类加载机制就是将Class文件加载到内存,然后到数据进行校验 转换解析,最后初始化,形成可以被直接使用Java类型
Java的类加载机制的不同在于,Java中类的加载和初始化都是在运行期间完成的,这种实现为Java提供了高度的灵活性.而在Java加载Class文件到虚拟机内存中时候,到卸载内存时候,整个生命周期包括了 加载 验证 准备 解析 初始化 使用 卸载
整体流程分为了
为了支持Java的运行时绑定,其可以先进行初始化,再进行解析,也就是真正的顺序是不确定的
对于类的加载的时机:
对于类的加载,Java并没有强制规定,只规定了有5种情况必须要进行初始化,而初始化之前要进行加载
1.具有 new getstatic putstatic invokestatic 4个字节码指令的时候,必须要先进行了初始化
2.使用reflect中的方法进行反射创建的时候,必须初始化
3.一个类初始化的时候,必须要先初始化父类
4.虚拟机启动时候必须初始化主类
5.使用动态语言支持的时候
6.当一个接口定义了default,那么实现这个类被初始化的时候,触发这个接口的初始化
7.初次调用MethodHandle实例的时候,初始化这个MethodHandle 指向的方法所在的类
上述的都是主动初始化,而被动初始化则是,
1.通过子类去调用父类中的静态字段的时候,不会触发子类的初始化,只有直接定义了这个字段的类才会被初始化.
2.通过定义数组来引用类,不会触发其类的初始化
比如: SuperClass[] A= new SuperClass[10]
并不会直接触发SuperClass的初始化阶段,会生成一个虚拟机自动生成的,继承了Object的子类
3.常量在编译阶段会存入调用类的常量池,所以并不会触发常量的类的初始化