2

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

类索引

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

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

我环顾四周,但据我所知,仅凭字节码是不可能区分接口类型和类类型的,即在运行时针对类加载器解析命名类/接口之前实际检查此要求。

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

4

1 回答 1

1

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

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

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

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

于 2019-01-28T16:31:44.980 回答