Java类文件中存储的泛型类型在哪里? [英] Where are generic types stored in java class files?
问题描述
我很清楚泛型类型在编译时会从Java代码中删除。什么信息(属性?)1.5+ JVM用来实现 getGenericType
等等?它们存储在签名
属性中; 请参阅更新的Java虚拟机规范,以及第4.4.4节中字段类型签名的格式。
下面是一个使用 javap -verbose java.util的示例。 Map
:
public interface java.util.Map
SourceFile:Map.java
签名:长度= 0x2
00 1E
[其他属性省略]
此处的 Signature
属性指定(如果您将其视为big-endian,就像JVM类文件格式中的所有整数数量一样)常量池值#30( 30 = 0x1E)。所以让我们来看看:
const#30 = Asciz< K:Ljava / lang / Object; V:Ljava /郎/对象;> Ljava /郎/对象;;
在4.4.4中指定的语法环境中阅读此内容。因此,它使用了两个类型参数: K extends java.lang.Object
和 V extends java.lang.Object
。类型本身( Map
)也扩展了类 java.lang.Object
,并且没有接口。
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. ?
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.
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]
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;;
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类文件中存储的泛型类型在哪里?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!