在java 8规范的第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在一个类文件中的隔离?
发布于 2019-01-28 16:31:44
您说得对,CONSTANT_Class_info不会告诉您所引用的类型是否是接口,而且除了实际解析该类型之外,您只能在当前类文件中收集有关该类型的预期性质的提示,并且可能会在使用不一致的情况下检测它。
除了CONSTANT_Methodref_info期望声明的类型不是接口和CONSTANT_InterfaceMethodref_info期望它是接口之外,班级字段中存在的类型引用意味着非接口类型,而接口数组中的任何类型都意味着接口。
在嵌套类型的情况下,您可以检查InnerClasses属性,它列出了所有嵌套类型及其访问标志,包括ACC_INTERFACE。
此外,作为注释的每个类型在技术上都是一个接口,尽管注释属性不使用CONSTANT_Class_info池项,而是直接引用类型名称和签名字符串(CONSTANT_Utf8_info)。
https://stackoverflow.com/questions/54380349
复制相似问题