background image

2. 通过数组定义类应用类:ClassA [] array=new ClassA[10]。触发了一

个名为[LClassA 的类的初始化,它是一个由虚拟机自动生成的、直接继
承于 Object 的类,创建动作由字节码指令 newarray 触发。

3. 常量会在编译阶段存入调用类的常量池。

 

编译器会为接口生成<clinit>()构造器,用于初始化接口中定义的成员变量。
一个接口在初始化时,并不要求其父类接口全部完成了初始化,只有在真正
使用到父接口的时候才会初始化。

 

1.      加载

1. 通过一个类的全限定名来获取此类的二进制字节流。
2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
3. 在 java 堆中生成一个代表这个类的 Class 对象,作为方法区这些数据

的访问入口。

 

 

2.      验证

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

虚拟机规范:如果验证到输入的字节流不符合 Class 文件的存储格式,就抛
出一个 java.lang.VerifyError 异常或其子类异常。

 

1. 文件格式验证:验证字节流是否符合 Class 文件格式的规范,并且能

被当前版本的虚拟机处理。这个阶段的验证时给予字节流进行的,经过
了这个阶段的验证之后,字节流才会进入内存的方法区中进行存储所
以后面的验证阶段都是给予方法区的存储结构进行的。

2. 元数据验证:对类的元数据信息进行语义校验,保证不存在不符合

java 语言规范的元数据信息。

3. 字节码验证:进行数据流和控制流分析,对类的方法体进行校验分析,

保证被校验的类的方法在运行时不会做出危害虚拟机安全的行为。

4. 符号引用验证:发生在虚拟机将符号引用转化为直接引用的时候(解析

阶段),对常量池中的各种符号引用的信息进行匹配性的校验。