我很清楚泛型类型在编译时会从 Java 代码中删除。 1.5+ JVM 使用什么信息(属性?)来实现 getGenericType
等?
最佳答案
它们存储在Signature
属性中;参见 updated Java Virtual Machine Specification 的第 4.8.8 节, 以及字段类型签名格式的 4.4.4 节。
这是一个使用 javap -verbose java.util.Map
的例子:
public interface java.util.Map
SourceFile: "Map.java"
Signature: length = 0x2
00 1E
[other attributes omitted]
此处的 Signature
属性指定(如果您将其理解为大端,就像 JVM 类文件格式中的所有整数一样)常量池值 #30 (30 = 0x1E)。那么让我们看看那里:
const #30 = Asciz <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;;
在 4.4.4 中指定的语法上下文中阅读此内容。因此,这使用了两个类型参数,K extends java.lang.Object
和 V extends java.lang.Object
。类型本身 (Map
) 也扩展类 java.lang.Object
,但没有接口(interface)。
关于java - 泛型类型存储在 java 类文件中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937933/