Java类文件中存储的泛型类型在哪里? [英] Where are generic types stored in java class files?

查看:199
本文介绍了Java类文件中存储的泛型类型在哪里?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很清楚泛型类型在编译时会从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆