现在我们来研究研究,Java类和对象的初始化,下面是一幅类的生命周期全景图,当然还是比较粗略.
从这幅图中,我们可以看出,类的装载到初始化主要分为3个阶段:
(1)类的装载(Load Class):
- 通过该类型的完全限定名,产生一个代表该类型的二制制数据流。
- 简单检查二进制数据,确保每一个部分都在正确位置,如魔数,文件不是太长或太短等.
- 解析这个二进制数据流为方法区内的内部数据结构。
- 创建一个表示该类型的java.lang.Class类的实例。
(2)类的连接(Link):
当类别加载后,就进入连接阶段。连接就是把已经读入到内存的类的二进制数据合并到虚拟机的运行时状态中.
连接有又分为三个阶段:
①验证(Verify):
确保被加载类的正确性。虽然在加载的时候已经验证,但虚拟机并不知道这个class到底是由谁创建的,是程序员还是黑客,经过验证可以保证程序的健壮性和
安全性 .
a.检查final的类不能拥有子类.
b.检查final的方法不能被覆盖.
c.确保在类型和超类型之间没有不兼容的方法声明(如两个方法拥有相同的名字,参数在数量,顺序,类型上都相同,但是返回类型不同).
d.检查所有的常量池入口相互之间一致(比如,一个Constant_String_info入口的string_index项目必须是一个Constant_Utf8_info入口的索引)
e.检查常量池中的所有特殊字符串(类名,字段名和方法名,字段描述符和方法描述符)是否符合格式.
f.检查字节码的完整性,防止JVM由于字节码不完整崩溃.