JAVA中类的加载过程

85 阅读2分钟

类的加载包括五个过程:加载、验证、准备、解析、初始化。

加载

在加载阶段,JVM会做三件事情:通过类的全限定名称获取该类的二进制字节流、将二进制字节流所代表的静态结构转化为方法区的运行时数据结构、在内存中创建一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

验证

验证阶段是确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机的自身安全。

验证过程: 文件格式验证: 元数据验证: 字节码验证: 符号引用验证:

准备

准备阶段是正式为类变量(“静态成员变量”)分配内存并设置初始值的阶段。这些变量(不包括实例变量)所使用的内存都放在方法区中进行分配。初始值通常情况下是数据类型的零值(0,Null),假设一个类变量的定义为: public static int value = 123;

变量value在准备阶段过后的初始值不是123了,而是为0,因为这时候尚未执行任何JAVA方法,如果类字段的字段属性表中存在ConstantValue属性,那么在准备阶段value就会被初始化为ConstantValue属性所指定的执,假设上面的定义为: public static final value = 123; 那么在准备阶段虚拟机就会根据ConstantValue的设置将value赋值为123.

解析

解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程。

初始化

类初始化阶段是类加载过程的最后一步,是执行类构造器 () 方法的过程。() 方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static {} 块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。静态语句块中只能访问定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但不能访问。