Classwo***ng 工具箱: 泛型与ASM - 编程入门网
Classwo***ng 工具箱: 泛型与ASM时间:2011-10-16 IBM Dennis Sosnoski了解如何使用 ASM 字节码框架从 Java 5 中访问泛型信息 简介:Java™ 5 泛型提供了对于许多 classwo***ng 都非常有用的信息。尽管 Java 反射可用 于为载入的类获取泛型信息,但要求类必须载入到 JVM 中,这是一个很大的缺点。在本文中, classwo***ng 精神领袖 Dennis Sosnoski 展示了 ASM Java 字节码操纵框架怎样在无需经过 Java classloading 处理的情况下提供对泛型信息的灵活访问。在文中,他还深入探讨了泛型的二进制类表示 。 Java 5 程序中的泛型信息对于理解程序的数据结构非常有帮助。在 上一期 中,我为您介绍了如何使 用运行时反射来访问泛型信息。如果您仅对获得载入 JVM 中的类的信息感兴趣,那么这种反射方法非常 有效。但有时您可能希望在载入类之前对其加以修改,或者希望在不载入类的情况下研究数据结构。在这 样的时候,反射对您来说就不再是一种行之有效的办法 —— 反射将 JVM 类结构作为信息源 使用,因此它仅对已由 JVM 装载的类起作用。 要想在不将类载入 JVM 的情况下访问泛型信息, 您需要一种读取存储在二进制类表示内的泛型信息的方法。在前几期文章中,已经介绍过 ASM classwo***ng 库是怎样提供了一种清洁的接口,以读取及写入二进制类。在这篇文章中,我将向您展示 如何利用 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |