泛型类型存储在 java 类文件中的什么位置?

2022-01-16 00:00:00 jvm java generics

我很清楚泛型类型在编译时会从 Java 代码中删除.1.5+ JVM 使用什么信息(属性?)来实现 getGenericType 等?

I am well aware that generic types are erased from Java code when it is compiled. What information (attributes?) do 1.5+ JVMs use to implement getGenericType , etc. ?

推荐答案

它们存储在 Signature 属性中;请参阅 更新的 Java 虚拟机规范,以及第 4.4.4 节中关于字段类型签名的格式.

They are stored in Signature attributes; see section 4.8.8 of the updated Java Virtual Machine Specification, as well as section 4.4.4 for the format of the field type signature.

这是一个使用 javap -verbose java.util.Map 的示例:

Here's an example using 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).那么让我们看看那里:

The Signature attribute here specifies (if you read this as big-endian, like all integer quantities in the JVM class file format are) constant pool value #30 (30 = 0x1E). So let's have a look there:

const #30 = Asciz       <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;;

在 4.4.4 中指定的语法上下文中阅读此内容.因此,这使用了两个类型参数,K extends java.lang.ObjectV extends java.lang.Object.类型本身(Map)也扩展类java.lang.Object,并且没有接口.

Read this in the context of the grammar specified in 4.4.4. So, this uses two type parameters, K extends java.lang.Object and V extends java.lang.Object. The type itself (Map) also extends class java.lang.Object, and no interfaces.

相关文章