欢迎来到天天文库
浏览记录
ID:22679424
大小:102.01 KB
页数:12页
时间:2018-10-30
《classworking工具箱泛型与as》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Java™5泛型提供了对于许多classworking都非常有用的信息。尽管Java反射可用于为载入的类获取泛型信息,但要求类必须载入到JVM中,这是一个很大的缺点。在本文中,classworking精神领袖DennisSosnoski展示了ASMJava字节码操纵框架怎样在无需经过Javaclassloading处理的情况下提供对泛型信息的灵活访问。在文中,他还深入探讨了泛型的二进制类表示。Java5程序中的泛型信息对于理解程序的数据结构非常有帮助。在上一期中,我为您介绍了如何使用运行时反射来访问泛型信息。如果您仅对获得载入JVM中的类
2、的信息感兴趣,那么这种反射方法非常有效。但有时您可能希望在载入类之前对其加以修改,或者希望在不载入类的情况下研究数据结构。在这样的时候,反射对您来说就不再是一种行之有效的办法——反射将JVM类结构作为信息源使用,因此它仅对已由JVM装载的类起作用。要想在不将类载入JVM的情况下访问泛型信息,您需要一种读取存储在二进制类表示内的泛型信息的方法。在前几期文章中,已经介绍过ASMclassworking库是怎样提供了一种清洁的接口,以读取及写入二进制类。在这篇文章中,我将向您展示如何利用ASM从类文件中获取原始泛型信息,如何以一种有用的方式解释
3、泛型。在钻研ASP细节之前,让我们首先来看看泛型信息编码到二进制类中的实际方式。跟踪泛型为将可由Java编译器使用的键入信息添加到Java二进制类中,需要使用泛型规范设计器。幸运的是,Java平台已有一种内置于二进制类格式中的机制,可用于此目的。这种机制就是属性结构(attributestructure),它主要使所有类型的信息可与类本身或类的方法、字段及其他组件相关联。某些类型的属性信息是由JVM规范定义的,但Java语言的原始设计器作出了明智的选择,将一组可能出现的属性保留为开放,从而可由新版本的规范加以扩展,也可由用户扩展以设计其自
4、己的自定义属性。泛型信息存储在一个新的标准属性中:签名属性。该属性是一个简单的文本值,为类、字段、方法或变量解码泛型信息。更新的Java5JVM规范(参考资料部分给出了Java5更改页面的链接)清楚地说明了签名文本值的完整语法。在这里我不打算加以详述,但本节稍后的部分中会简单介绍签名。首先将介绍一些必备的背景信息,以使您了解类名称的内部结构及JVM所使用的字段和方法描述符。深入内部Java平台中的类总是来自某些包。当您在Java源代码中引用类名称时,您或许会也或许不会真正将包限定作为名称的一部分。您总是可以包含包限定(形如java.lan
5、g.String),但您也可以为了省事而忽略它——如果类来自java.lang包或已import到源文件中。这种包含包限定的类名称结构就称为“完全限定”类名。在实际的二进制类内部,类名称总是在一个包中指定的。但这种名称的格式与Java源代码中的完全限定类名略有差别,使用正斜杠(“/”)取代圆点(“.”)。例如,在String类中,名称的内部形式为java/lang/String。如果您尝试将一个类文件作为文本输出或查看,那么通常会看到上述形式的多个字符串,每个字符串都是对某个类的引用。采用这种内部形式的类引用是作为字段和方法描述符的一部分
6、使用的。字段描述符指定类中定义的一个类的准确类型。所使用的表示法取决于字段是简单对象类型、简单原语类型还是数组类型。简单对象类型的表示法为,以‘L’开头,后接对象类名称的内部形式,以‘;’结尾。原语类型的表示法为,各类型使用一个单独的字母(如‘I’表示int、‘Z’表示布尔型)。数组类型的表示法为,以‘[’作为数组项类型(其本身也可为数组类型)的前缀修饰符。表1给出了关于各字段描述符的示例,另外还列出了相应的Java源代码声明:表1.字段描述符示例描述符源代码Ljava/lang/String;StringIint[Ljava/lang/
7、Object;Object[][Zboolean[][[Lcom/sosnoski/generics/FileInfo;com.sosnoski.generics.FileInfo[][]方法描述符结合了字段描述符,以指定方法的参数类型和返回类型。方法描述符的格式非常易于理解。以‘(’开始,后接参数的字段描述符(均一起运行),随后是‘)’,最后以返回类型结尾(若返回类型为void,则以‘V’结尾)。表2给出了方法描述符的一些示例,同时还列出了相应的Java源代码声明(注意方法名称和参数名称本身并非方法描述符的一部分,所以在表中使用了占位符
8、):表2.方法描述符示例描述符源代码(Ljava/lang/String;)Iintmmm(Stringx)(ILjava/lang/String;)Vvoidmmm(intx,Stringy
此文档下载收益归作者所有