background image

 

3.      准备

准备阶段是正式为类变量分配内存并设置类变量初始值(各数据类型的零值)的
阶段,这些内存将在方法区中进行分配。但是如果类字段的字段属性表中存在
ConstantValue 属性,那在准备阶段变量值就会初始化为 ConstantValue 属
性指定的值。

public static final int value=122;

 

4.      解析

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

 

符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式
的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的
内存布局无关,引用的目标并不一定已经加载到内存中。

 

直接引用:直接引用可以是直接指向目标的指针、相对偏移量或者一个能间接
定位到目标的句柄。如果有了直接引用,那引用的目标必定已经在内存中存在。

 

  A.    类或接口(对应于常量池的 CONSTANT_Class_info 类型)的解
析:

假设当前代码所处的类为 D,需要将一个从未解析过的符号引用 N 解析为一
个类或接口 C 的直接引用:

1. 如果 C 不是一个数组类型,虚拟机将会把代表 C 的全限定名传递给 D

的类加载器去加载这个类。

2. 如果 C 是一个数组类型,并且数组的元素类型为对象(N 的描述符类似

[Ljava.lang.Integer),将会加载数组元素类型(java.lang.Integer),
接着由虚拟机生成一个代表此数组维度和元素的数组对象。

3. 如果以上过程没有发生异常,则 C 在虚拟机中已经成为了一个有效的

类和接口了,之后还要进行的是符号引用验证,确认 D 是否具有对 C
的访问权限,如果没有,将抛出 java.lang.IllegalAccessError 异常。