类型的装载连接和初始化

来源:互联网 发布:旋转矩阵大全 编辑:程序博客网 时间:2024/05/17 23:10

类型的装载,连接和初始化

以上的操作都是在Java虚拟机中完成的

装载:将二进制的java类型读入虚拟机中,实际上就是class文件的装载。

连接:将二进制形式的类型数据合并到虚拟机运行时状态中去。

初始化:给类变量赋予合理的初始值。

 

在连接过程中,又分为三个状态

验证:验证数据类型是否是正确并适合虚拟机使用

准备:为类型分配所需内存

解析:解析可以发生在初始化之前,也可以之后,之后的情况是,在运行中的程序真正使用某个符号引用时去解析它(将符号引用转换为直接引用)

 

初始化需要时机,虚拟机必须在类和接口首次主动使用时初始化

1. 创建某个类的新实例时(new指令 不明确的创建,反射,克隆,反序列化)

2. 调用静态方法时

3. 当使用某个类或者接口的静态字段或者对该字段进行赋值时,用final修饰的静态字段除外,它被初始化为一个编译时的常量表达式

4. 调用Java API的反射方法

5. 初始化某个类的子类时(某个类初始化,必须要求其父类已经被初始化)

6. 含有main()方法的类

除了上述六种情况,其他Java类型都是被动使用,不会引起Java类型的初始化

 

装载

装载过程主要有三部分组成

1. 通过该类型的完全限定名,产生一个代表该类型的二进制数据流

2. 解析这个二进制数据流的方法区内的数据结构

3. 创建一个表示该类型的java.lang.Class类的实例

这个二进制流不一定遵循Java Class格式,可能尊虚其他的格式。所有java虚拟机都必须能识别Java class格式,但是个别的实现可以识别其他的二进制格式。

这个二进制流的产生途径可能为:

1. 网上下载的Java Class 文件

2. 本地文件装载的Java Class文件

3. 从ZIP,JAR,CAB或其他归档文件中提取的Java Class文件

4. 从一个专有数据库中提取的Java Class文件

5. 把一个Java 源文件动态编译为Java Class文件

6. 动态为某个类型计算其class文件格式

7. 使用上述任何方法,但是不同于Java Class文件的其他二进制文件

 

装载的最终产品是java.lang.Class的一个实例对象,他成为java程序和内部数据结构之间的接口。该对象建立在堆上。

 

验证

类型被装载后,就可以准备连接了。连接的第一个步骤是验证。

当然验证实质上在连接装载时就已經开始进行。装载期进行的检查有:1. 保证数据类型都是预期的数据类型,2. 保证每个类有个一个超类,除了Object。

还有一种检查发生在正式验证阶段之后:1. 符号引用的验证,把符号引用替换为直接引用。

正式验证所作的检查有:

1. 检查final类不能拥有子类

2. 检查final类不能被覆盖

3. 确保类型和超类之间没有不兼容的方法声明

 

准备

准备阶段Java虚拟机为类变量分配内存,并初始化其值。

 

解析

后续篇章进行补充

 

初始化

0 0