Where are generic types stored in java class files?(泛型类型存储在 java 类文件中的什么位置?)
问题描述
我很清楚泛型类型在编译时会从 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.Object
和 V 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.
这篇关于泛型类型存储在 java 类文件中的什么位置?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:泛型类型存储在 java 类文件中的什么位置?


- C++ 和 Java 进程之间的共享内存 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01