我对下面的段落感到困惑(来源Oracle JVM specification for invokespecial instruction)。
如果满足以下所有条件,则将C作为直接超类 当前班级:
- 已解析的方法不是实例初始化方法(第2.9节)。
- 如果符号引用命名一个类(不是接口),那么该类是当前类的超类。
- 为类文件(第4.1节)设置ACC_SUPER标志。
醇>
我在 invokespecial 指令说明的第一段中制作了一些标签(符号: // label // )。我在下面的问题中使用了这个标签。
unsigned indexbyte1和indexbyte2用于构造索引 进入当前类 //当前类// (§2.6)的运行时常量池,其中 索引的值是(indexbyte1<< 8)| indexbyte2。运行时 该索引处的常量池项必须是对a的符号引用 方法或接口方法(第5.1节),它提供名称 //方法名称// 和 描述符 //方法描述符// (§4.3.3)的方法以及符号引用 类 //引用类// 或要在其中找到方法的接口。命名 方法已解决 //已解决的方法// (§5.4.3.3,§5.4.3.4)。
根据标签我现在用条件检查段落。
- 已解析的方法不是实例初始化方法(第2.9节)。
醇>
问题1 :所以,我检查 //方法名称// 是否不等于“< init>”或“< clinit>”,对吧?
- 如果符号引用命名一个类(不是接口),那么该类是当前类的超类。
醇>
问题2 :这意味着什么? //引用类// 必须是 //当前类// 的直接或非直接超类(超类的超类等)?
- 为类文件(第4.1节)设置ACC_SUPER标志。
醇>
问题3 :哪个类的类文件? //引用类// ?