类加载过程

一  加载

 在加载阶段,虚拟机完成以下几件事:首先通过一个类的全限定名获取此类的二进制流

 将这个字节流所代表的的静态存储结构转换成方法区的运行时数据结构

 在内存中生成一个代表该类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

二  验证

1 文件格式验证

 

第一阶段要验证字节流是否符合Class文件格式的规范,并且能被当前版本的虚拟机处理,这一阶段可能包括下面这些验证点:

是否以魔数0xCAFEBABE开头

主、次版本号是否在当前虚拟机处理范围之内

常量池的常量中是否有不被支持的常量类型

..........

2 元数据验证

这个类是否有父类(除了java.lang.Object之外,所有的类都应该有父类)

这个类的父类是否继承了不允许被继承的类(被final修饰的类)

如果这个类不是抽象类,是否实现了其父类或接口中要求实现的所有方法。

类中的方法,字段是否与父类产生了矛盾。

 

3 字节码验证

保证任何时刻操作数栈的数据类型的指令代码序列都能配合工作。

保证跳转指令不会跳转到方法体制外的字节码指令上

保证方法体中的类型转换是有效的,例如可以把一个子类对象赋值给父类数据类型,这事安全的。

 

4 符号引用验证

符号引用中通过字符串描述的全限定名是否能找到对应的类。

在指定类中是否存在符合方法的字段描述符以及简单名称所描述的方法和字段

符号引用中的类,字段,方法的访问性(private,protected,public,default)是否可以被当前类访问。

三 准备

准备阶段是正是为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。

在这里注意一下类变量和类常量的区别

如果定义 public static int count=100; 在准备阶段过后的初始值是0而不是100,因为这个时候还没开始任何的Java方法。但是将上面的赋值语句定义为 public static final int count=100;编译时 javac会为count生成ConstantValue属性,在准备阶段虚拟机就会根据ConstantValue的设置将value设置为100

四  解析

解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程

1 类或接口的解析

假设当前代码所处的类为D,如果要把一个从未解析过的符号引用N解析为一个类或接口c的直接引用,虚拟机完成整个解析的过程需要以下三个步骤

1) 如果c不是一个数组类型,那么虚拟机会把代表N的全限定名传递给D的类加载器去加载这个类型c。在加载过程中,可能触发其他相关类的加载动作,例如加载这个类的父类或者实现的接口。一旦这个加载过程中出现了任何异常,解析过程就宣告失败。

2)如果c是一个数组类型,并且数组的元素类型为对象,也就是N的描述符会是类似于[Ljava/lang/Integer的形式

3)如果上面的而不周没有出现任何异常,那么c在虚拟机中实际上已经成为一个有效的类或借口了,但在解析完成之前还要进行符号引用验证,确认D是否具备对c的访问权限。如果没有,就跑出java.lang.IllegalAccessError异常。

2 字段解析

解析一个从未被用过的字段符号引用。将这个字段所属的类或者接口用c表示

1) 如果c本身就包含了简单名称和字段描述符都相匹配的字段,则返回这个字段的直接引用,查找结束。

2) 否则,如果在c中实现了接口,按照继承关系会从下往上递归搜索各个接口和它的父接口,如果接口中包含了简单名称和字段描述符都与目标相匹配的字段,则返回这个字段的直接引用。

3)否则,如果c不是java.lang.Object的话,将会按照继承关系从下往上搜索其父类,如果在父类中包含了简单名称和字段描述符都与目标相匹配的字段,则返回这个字段的直接引用,查找结束

4)否则,查找失败。抛出java.lang.NoSuchFieldError异常。

如果查找过程中成功返回了引用,将会对这个字段进行权限验证,如果发现不具备对字段的访问权限,将会抛出异常。、

3 类方法解析

4 接口方法解析

3,4的解析过程和2的一样,只不过一个是字段,一个是方法。

二,三,四就是类的连接过程。之后就是类的初始化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值