8.1.7 解析CONSTANT_interfaceMethodref_info入口

8.1.7 解析CONSTANT_interfaceMethodref_info入口

要解析类型为CONSTANT_interfaceMethodref_info的常量池人口,虚拟机首先要解析 class_index项中指定的CONSTANT_Class_info人口。所以,任何在解析CONSTANT_Class_info 过程中可能抛出的错误,在解析CONSTANT_InterfaceMethodref_info过程中都有可能抛出。如果解析CONSTANT_Class_info成功,虚拟机在接口和它的超类型中搜索指定的方法。(虚拟机不需要确认当前类型由访问方法的权限,因为接口中定义的所有方法都是隐含公开的。)

如果解析CONSTANT_Class_info成功完成了,虚拟机按照如下步骤来执行接口方法解析:

1)如果被解析的类型是一个类,而非接口,虚拟机抛出IncompatibleaassChangeError异常。

2)否则,被解析的类型是一个接口。虚拟机检查被引用的接口是否有方法符合指定的名字 和描述符。如果发现了这样的一个方法,该方法就是成功的接口方法搜索结果。

3)否则,虚拟机检查类(此处怀疑为原书错误?应该是接口。——译者注)的直接超接口, 并且递归地检查接口的所有超接口以及java.lang.Object类来查找符合指定名字和描述符的方法。 如果发现了这样的一个方法,该方法就是成功的接口方法搜索结果。

4)如果虚拟机没有在被引用的接口和它的任何超类型中找到名字、返回类型、参数的数量 和类型都符合的方法,虚拟机抛出NoSuchMethodError异常。

否则,虚拟机把这个人口标记为已解析,并旦在这个常量池人口的数据中放上指向这个方 法的直接引用。

原文地址:https://www.cnblogs.com/mongotea/p/11979601.html