8.1.6 解析CONSTANT_Methodref_info入 口

8.1.6 解析CONSTANT_Methodref_info入 口

要解析CONSTANT_Methodref_info类型的常量池人口,虚拟机必须先解析class_index项中 指定的CONSTANT_Class_info人口。也就是说,所有CONSTANT_Class_info解析过程中可能抛 出的锗误在解析CONSTANT_Methodref_info的过程屮都可能被抛出。如果解析CONSTANT_Class_info成功,虚拟机在类型和它的超类型中搜索指定的方法。如果找到了指定的方法,虚拟机检査当前类是否有权限去访问这个方法。

如果解析CONSTANT_Class_info成功完成,虚拟机使用如下步骤来执行方法解析:

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

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

3)否则,如果类有一个直接超类,虚拟机检查类的直接超类,并且递归地检查类的所有超 类,査看是否有方法符合指定的名字和描述符。如果虚拟机找到了这样的一个方法,该方法就 是成功的方法搜索结果。

4)否则,虚拟机检查是否这个类直接实现了任何接口,并且递归地检査由类型直接实现的 接口的超接口,察看是否有方法符合指定的名字和描述符。如果虚拟机找到了这样的一个方法, 该方法就是成功的方法搜索结果。

5)否则,方法搜索失败。

如果虚拟机没有在被引用的类和它的任何超类型中找到名字、返回类型、参数数量和类型 都符合的方法(方法捜索失败),虚拟机抛出NoSuchMethodError异常。否则,如果方法存在, 但是方法是一个抽象方法,虚拟机抛出AbstractMethodError异常。否则,如杲方法存在,但是当前类没有访问方法的权限,虚拟机抛出IllegalAccessError异常。

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

猜你喜欢

转载自www.cnblogs.com/mongotea/p/11979598.html