Java 在类文件中查找对其他类的引用的简单方法

Java 在类文件中查找对其他类的引用的简单方法,java,parsing,jvm,.class-file,Java,Parsing,Jvm,.class File,中所述的类文件格式包含对as CONTANT_Utf8类型条目中其他类的所有引用 但这些条目不仅是对类的引用,还包括类文本、方法名、字段等等 在第一次尝试中,我认为使用constant_Class、constant_NameAndType和constant_MethodType类型的其他constant_池项引用的constant池项就足够了 但这些似乎不包括类型参数和注释。对规范的进一步阅读似乎表明,我需要解析和类似的构造,以便识别相关的常量池条目。这意味着我必须或多或少地解析完整的类文件 但

中所述的类文件格式包含对as CONTANT_Utf8类型条目中其他类的所有引用

但这些条目不仅是对类的引用,还包括类文本、方法名、字段等等

在第一次尝试中,我认为使用constant_Class、constant_NameAndType和constant_MethodType类型的其他constant_池项引用的constant池项就足够了

但这些似乎不包括类型参数和注释。对规范的进一步阅读似乎表明,我需要解析和类似的构造,以便识别相关的常量池条目。这意味着我必须或多或少地解析完整的类文件

但我自己解析类文件背后的整个想法是,它比使用ASM这样的库更简单,因为我认为它足以解释常量池


我的问题是:有没有一种方法可以可靠地识别类文件中引用的所有类,只需解释常量池就可以了

类加载器无法加载的注释类型将被该类加载器忽略,并且在运行时看起来不可见。我假设这就是注释引用的类型不是存储在常量池中的原因,在常量池中未知类型的解析将禁止成功加载类。注释是代码属性,即元数据,不应通过避免常量池条目将它们深入链接到类中


因此,您还需要内省位于常量池之外的RuntimeVisibleAnnotations。但是,如果常量池不包含字符串
RunntimeVisibleAnnotations
,则您的方法有效。但是ASM的开销很小,所以我还是会使用它。

当然,
RuntimeInvisibleAnnotations
也可以引用类型(其结构与
runtimevisibbleannotations
相同)。还有
RuntimeVisibleParameterAnnotations
RuntimeInvisibleParameterAnnotations
。如果它是用调试信息编译的,那么可以有
LocalVariableTable
LocalVariableTypeTable
。它们中的每一个(以及
Signature
属性)都可以为
UTF8
常量提供一个类型或签名含义…