Classworking 工具箱: 泛型与ASM - 编程入门网
Classworking 工具箱: 泛型与ASM时间:2011-10-16 IBM Dennis Sosnoski了解如何使用 ASM 字节码框架从 Java 5 中访问泛型信息 简介:Java™ 5 泛型提供了对于许多 classworking 都非常有用的信息。尽管 Java 反射可用 于为载入的类获取泛型信息,但要求类必须载入到 JVM 中,这是一个很大的缺点。在本文中, classworking 精神领袖 Dennis Sosnoski 展示了 ASM Java 字节码操纵框架怎样在无需经过 Java classloading 处理的情况下提供对泛型信息的灵活访问。在文中,他还深入探讨了泛型的二进制类表示 。 Java 5 程序中的泛型信息对于理解程序的数据结构非常有帮助。在 上一期 中,我为您介绍了如何使 用运行时反射来访问泛型信息。如果您仅对获得载入 JVM 中的类的信息感兴趣,那么这种反射方法非常 有效。但有时您可能希望在载入类之前对其加以修改,或者希望在不载入类的情况下研究数据结构。在这 样的时候,反射对您来说就不再是一种行之有效的办法 —— 反射将 JVM 类结构作为信息源 使用,因此它仅对已由 JVM 装载的类起作用。 要想在不将类载入 JVM 的情况下访问泛型信息, 您需要一种读取存储在二进制类表示内的泛型信息的方法。在前几期文章中,已经介绍过 ASM classworking 库是怎样提供了一种清洁的接口,以读取及写入二进制类。在这篇文章中,我将向您展示 如何利用 ASM 从类文件中获取原始泛型信息,如何以一种有用的方式解释泛型。在钻研 ASP 细节之前, 让我们首先来看看泛型信息编码到二进制类中的实际方式。 跟踪泛型 为将可由 Java 编译 器使用的键入信息添加到 Java 二进制类中,需要使用泛型规范设计器。幸运的是,Java 平台已有一种 内置于二进制类格式中的机制,可用于此目的。这种机制就是属性 结构 (attribute structure),它主 要使所有类型的信息可与类本身或类的方法、字段及其他组件相关联。某些类型的属性信息是由 JVM 规 范定义的,但 Java 语言的原始设计器作出了明智的选择,将一组可能出现的属性保留为开放,从而可由 新版本的规范加以扩展,也可由用户扩展以设计其自己的自定义属性。 泛型信息存储在一个新的 标准属性中:签名 属性。该属性是一个简单的文本值,为类、字段、方法或变量解码泛型信息。更新的 Java 5 JVM 规范清楚地说明了签名文本值的完整语法。在这里我不打算加以详述,但本节稍后的部分中 会简单介绍签名。首先将介绍一些必备的背景信息,以使您了解类名称的内部结构及 JVM 所使用的字段 和方法描述符。 深入内部 Java 平台中的类总是来自某些包。当您在 Java 源代码中引用 类名称时,您或许会也或许不会真正将包限定作为名称的一部分。您总是可以 包含包限定(形如 java.lang.String),但您也可以为了省事而忽略它 —— 如果类来自 java.lang 包或已 import 到源文件中。这种包含包限定的类名称结构就称为 “完全限定” 类名。 在实 际的二进制类内部,类名称总是在一个包中指定的。但这种名称的格式与 Java 源代码中的完全限定类名 略有差别,使用正斜杠 (“/”) 取代圆点 (“.”)。例如,在 String 类中,名 称的内部形式 为 java/lang/String。如果您尝试将一个类文件作为文本输出或查看,那么通常会看到上 述形式的多个字符串,每个字符串都是对某个类的引用。 采用这种内部形式的类引用是作为字段 和方法描述符的一部分使用的。字段描述符 指定类中定义的一个类的准确类型。所使用的表示法取决于 字段是简单对象类型、简单原语类型还是数组类型。简单对象类型的表示法为,以 ‘L’ 开 头,后接对象类名称的内部形式,以 ‘;’ 结尾。原语类型的表示法为,各类型使用一个 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |