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

标签 java generics jvm

我很清楚泛型类型在编译时会从 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.ObjectV extends java.lang.Object。类型本身 (Map) 也扩展类 java.lang.Object,但没有接口(interface)。

关于java - 泛型类型存储在 java 类文件中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937933/

相关文章:

java - log4j2:模式不包含日期

java - 首选项菜单中的操作栏 Sherlock

c# - 如何返回以接口(interface)为返回类型的接口(interface)的实现?

c# - 通用方法,其中 T 是实现接口(interface)的列表

父类(super class)中的 Kotlin Init Block 在继承时使用 null 属性触发

java - 如何在不同的JVM中创建EJB和客户端(纯java程序)

java - java中的Unicode到String但很棘手

java - 当给定输入时调用不同类的包?

c# - 将泛型与 LINQ 继承结合使用

java - 每个 Java 程序都崩溃并显示 : Failed to create the java virtual machine