十、类加载过程

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

1、加载

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

2、连接

      ⑴验证

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

      ⑵准备

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

类型默认值
byte(byte) 0
short(short) 0
int0
long0 L
float0.0 F
double0.0
char‘\u0000’
booleanfalse
referencenull
      ⑶解析

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

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

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

3、初始化

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stranger。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值