"interface name" 与 "class name" 的区别是什么?

What sets an "interface name" apart from a "class name"?

在 java 8 规范的 paragraph 4.4.2 中(在其他一些地方也类似)提到了

class_index

The value of the class_index item must be a valid index into the constant_pool table. The constant_pool entry at that index must be a CONSTANT_Class_info structure (§4.4.1) representing a class or interface type that has the field or method as a member.

The class_index item of a CONSTANT_Methodref_info structure must be a class type, not an interface type.

我环顾四周,但据我所知,单靠字节码不可能区分接口类型和 class 类型,即在解析命名的 [=20] 之前实际检查此要求=] 在运行时针对 class 加载程序。

我的假设是否正确,还是我错过了一种方法来单独检查 class 文件中的单个 CONSTANT_Class_info 的要求?

你是对的,CONSTANT_Class_info 不会告诉你引用的类型是否是一个接口,除了实际解析类型之外,你只能在你当前的 class 文件中收集关于类型的预期性质,并可能在使用不一致时进行检测。

除了 CONSTANT_Methodref_info 期望声明的类型不是接口并且 CONSTANT_InterfaceMethodref_info 期望它是接口之外,super_class field implies a non-interface type whereas any type present in the interfaces 数组中类型引用的存在意味着接口.

如果是嵌套类型,您可以检查 InnerClasses Attribute,它列出了所有嵌套类型及其访问标志,包括 ACC_INTERFACE.

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