什么使“接口名称”与“类名称”分开?

时间:2019-01-26 16:32:58

标签: java language-lawyer jvm-bytecode

在Java 8规范的paragraph 4.4.2中(类似在周围的其他地方)也提到了

  

class_index

     

class_index项目的值必须是指向constant_pool表的有效索引。该索引处的constant_pool条目必须是CONSTANT_Class_info结构(第4.4.1节),该结构表示将字段或方法作为成员的类或接口类型。

     

CONSTANT_Methodref_info结构的class_index项必须是类类型,而不是接口类型。

我环顾四周,但据我所知,仅凭字节码就无法将接口类型与类类型区分开,即在针对类加载器在运行时解析命名的类/接口之前实际检查此要求

我是按照这个假设纠正的吗?还是我错过了一种方法来从隔离类文件中的单个CONSTANT_Class_info中检查此要求?

1 个答案:

答案 0 :(得分:1)

是的,CONSTANT_Class_info不会告诉您所引用的类型是否是接口,除了实际解析该类型之外,您只能在当前类文件中收集有关该类型的预期性质的提示并检测出何时不一致地使用它。

除了CONSTANT_Methodref_info期望声明的类型不是接口,并且CONSTANT_InterfaceMethodref_info期望它是接口之外,super_class字段中类型引用的存在还意味着存在非接口类型,而interfaces数组中存在的任何类型都暗示一个接口。

对于嵌套类型,您可以检查InnerClasses Attribute,其中列出了所有嵌套类型及其访问标志,包括ACC_INTERFACE

此外,从技术上讲,每种用作注释的类型都是一个接口,尽管注释属性不使用CONSTANT_Class_info池项,而是直接引用类型名称和签名字符串(CONSTANT_Utf8_info)。