简明概述:类加载机制就是将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.常量在编译阶段会存入调用类的常量池,所以并不会触发常量的类的初始化

发表评论

邮箱地址不会被公开。 必填项已用*标注