十、类加载过程

来源:互联网 发布:java编程思想4 pdf 编辑:程序博客网 时间:2024/06/11 22:27

类加载的过程分为加载、连接(验证、准备、解析)和初始化三个步骤。

1、加载

       在加载阶段,虚拟机需要完成以下事情:
       ①通过一个类的权限定名来获取和定义此类的二进制字节流
       ②将二进制字节流的静态存储结构转换为方法区的运行时数据结构
       ③在Java堆中生成一个代表该类的Class对象,作为方法区数据的访问入口。

2、连接

      ⑴验证

       目的:为了确保Class文件的字节流中包含的信息符合虚拟机的要求,并且不会危害到虚拟机自身的安全。
       ①文件格式验证:验证字节流是否符合Class文件格式的规范,并且能够被当前虚拟机进行处理。
       ②元数据验证:对字节码描述的信息进行语义分析,以保证其描述的信息符合Java语言规范的要求。
       ③字节码验证:主要工作是进行数据流和控制流分析。这个阶段将对类的方法进行校验分析,确保运行时不会危害到虚拟机的安全。
       ④符号引用验证:这个验证发生在解析阶段,它的目的是确保解析动作能正常执行。

      ⑵准备

       为类的静态变量分配内存并设置默认初始值。

类型 默认值 byte (byte) 0 short (short) 0 int 0 long 0 L float 0.0 F double 0.0 char ‘\u0000’ boolean false reference null

      ⑶解析

       将虚拟机常量池中符号引用替换为直接引用。解析动作主要针对类或接口、字段、类方法、接口方法四类符号引用进行,分别对应常量池的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info及CONSTANT_InterfaceMetodref_info四种常量类型。

符号引用:以一组符号来描述所引用的目标,符号引用可以是任何形式的字面量,只要能唯一确定目标即可。
直接引用:可以是直接指向目标的指针、相对位移量或是一个能间接定位到目标的句柄。

符号引用与虚拟机的内存布局无关,引用的目标并不一定已经加载到内存中。直接引用与虚拟机的内存布局相关,同一符号引用在不同的虚拟机上翻译的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在内存中存在。

3、初始化

       类的初始化阶段是类加载过程的最后一步,前面的加载过程中,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余都由虚拟机主导和控制,到了初始化阶段,才真正开始执行类中定义的Java程序代码。
       初始化的顺序:若初始化类的父类还没有初始化,那么先对其父类进行初始化。若初始化类定义了初始化代码,那么按代码顺序执行初始化。

0 0