类(型)的生命周期--装载、连接、初始化、卸载 2009-02-14 13:04:54| 分类: Java |字号 订阅 Java 虚拟机通过装载、连接和初始化一个 Java 类型,使该类型可以被正在运行的Java 程序所使用。 1 . 装载 装载阶段包括三个基本动作: a) 通过该类型的完全限定名,产生一个代表该类型的二进制数据流。 b) 解析这个二进制数据流为方法区的内部数据结构(方法区) c) 创建一个表示该类型的java.lang.Class 类的实例(堆上) 二进制数据的产生的可能是很多的,比如:从本地系统装载一个class 文件、网络下载一个class 文件等等,有了这些二进制数据之后,java 虚拟机就会对这些数据进行足够的处理,然后它才能创建java.lang.Class 的实例对象。 装载步骤的最终产品就是这个Class 类的实例对象,它成为Java 程序与内部数据结构之间的接口。要访问关于该类型的信息,程序就要调用该类型对应的Class对应的方法。 这样一个过程就是把一个二进制数据解析为方法区中的内部数据结构、并在堆上建立一个Class 对象的过程,称为“创建”类型。 2 . 连接 在类型被装载以后,就准备连接了。连接过程的第一步就是:验证 2 .1 验证 在装载过程中,虚拟机必须解析代表类型的二进制数据流,并且构造内部数据结构,这时候就必须做一些特定的检查,以保证解析二进制数据的初始工作不会导致虚拟机崩溃。比如确保每一个部分在正确的位置,拥有正确的长度,验证文件不是太长或者太短,等等,虽然这些检查在装载期间完成,是在正式连接验证之前完成,但是它们在逻辑上仍然属于验证阶段。 在正式的验证阶段可能需要完成一下检查: 检查 fin al 的类不能拥有子类 检查 fin al 的方法不能被覆盖 确保在类型和超类型之间没有不兼容的方法声明 检查所有常量池入口相互之间一致 检查常量池中所有的特殊字符串 检查字节码完整性 上面列出的最复杂的任务就是:字节码完验证。所有的Java 需以及都必须设法为它们执行的每一个方法检查字节码的完整性。 2 .2 准备 在准备阶段,Java 虚拟机为类变量分配内存,设置默认初始值。但在到达初始化之前,类变量都没有被初始化为真正的初始值(准备阶段不执行 Java 代码)。 2 .3 解析 解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用的过程。 3 . 初始化 初始化就是为类变量赋予正确的初始值。 3...