将符号引用转为了直接引用

就是将class文件中写明的字面量形式明确定义在Java虚拟机规范的Class文件格式中

直接引用:就是直接指向目标的指针,可以定位到目标的句柄,有了直接引用,说明引用的目标已经在内存中存在了

具体的解析:

1.类或者接口的解析,如果一个没有解析的符号解析成某个类或者接口的直接引用,需要如下过程

如果不是一个数组的类型,那么会将被解析的类的全限定类名传递给其,让其解析,在此过程中,可能会触发其他类的加载动作,一旦有一个出现了异常,那么解析就会失败

如果是一个数组,那么也会进行如上解析,但是描述可能会发生改变

如果没有任何异常,这就已经是一个有效的类或者接口了

2.字段的解析

解析一个字段的流程如下,首先解析这个类的符号引用,如果出现异常则终止操作,成功则继续,如果只有简单的名称和相对应的字段,则直接结束

如果其中包含了接口,则查找接口的子父类,查看是否包含简单名称和字段描述符都符合

如果连Object类都不继承的话,只能找父类关系

不然就抛出 NoSuchFieldError异常

3.类方法的解析

解析出class_index项中索引的方法所属的类或者接口的符号引用

首先在解析的时候查看到这个方法是在接口中的,直接抛出异常

如果不是的话,在该类中查找是否有匹配的方法

在之后在父类中查找是否有相匹配的方法

最后在实现的接口的列表或者父接口中查找是否有匹配的方法,有就说明这是一个抽象类,连着都没有则抛出异常

4.接口方法的解析

类似同上,如果发现索引是个类不是接口.也会抛出异常

不然在接口中查找是否有匹配的方法

在之后在父类中查找

不然只能抛出异常

发表评论

邮箱地址不会被公开。 必填项已用*标注