快速业务通道

Classworking 工具箱: 泛型与ASM - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
working 工具箱: 泛型与ASM(3) 时间:2011-10-16 IBM Dennis Sosnoski

由于类并非参数化类型 ,所以未为该类本身的二进制类表示添加任何签名。但确实 为使用参数化类型的字段和方法使用了签名 。 m_files 字段签名表示这是一个 List,且类型为 FileInfo;而 m_directories 字段签名则表示这是 一个类型为 DirInfo 的 List。同样, getDirectories() 方法签名表示该方法返回一个类型为 DirInfo 的 List,而 getFiles() 签名则表示该方法返回一个类型为 FileInfo 的 List。

迄今为止,一 切看起来都相当容易理解,但事实真是如此吗?下面让我们看看清单 2,其中给出了一个简单的参数化类 定义和相应的签名字符串:

清单 2. 参数化类签名示例

public class  PairCollection<T,U> implements Iterable<T> {   /** Collection  with first component values. */   private final ArrayList<T>  m_tValues;   /** Collection with second component values. */    private final ArrayList<U> m_uValues;   ...   public void add(T t,  U u) {     m_tValues.add(t);     m_uValues.add(u);   }   public U get(T t) {     int index = m_tValues.indexOf(t);      if (index >= 0) {       return m_uValues.get(index);     }  else {       return null;     }   }   ... } Class signature:   <T:Ljava/lang/Object;U:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/Iterable<TT; >; m_tValues signature:  Ljava/util/ArrayList<TT;>; m_uValues  signature:  Ljava/util/ArrayList<TU;>; add signature:  (TT;TU;)V get signature:  (TT;)TU;

由于清单 2 中的类为参数化类型,所以类签名需要 以二进制类形式表示。与源代码相比,签名的文本要长一些,但如果您了解到,源代码中省略的类型参数 的所有可选组件都包含在签名中,那么理解起来也就不太困难了。签名的第一部分(位于尖括号 ‘<...>’ 内)就是该类的类型参数定义清单。这些定义的形式都相同,类型参数名称 后接类型的类边界和接口边界(若存在)的字段描述符。各字段描述符前加 ‘:’ 字符。由 于清单 2 源代码未为类的类型参数指定任何边界,因此其边界均为默认的类边界 java.lang.Object。

类签名的第二部分(尖括号外)给出了超类和超接口(若存在)的签名。在清单 2 所示的例子中 ,未指定任何超类,因此签名以 java.lang.Object 作为超类。这里指定了超接口,为 Iterable<T>。在签名中可以看到预期结果,源代码中使用的只是 ‘<T>’,而 签名中使用的是 ‘<TT;>’。原因在于签名需要区分类名称和类型变量名称,第一个 ‘T’标识紧随其后的内容为类型变量名,而结尾的‘;’ 表示名称结束。

清单 2 中的字段和方法签名利用了与超接口签名相同的变量格式类型,其他都与前面介绍的内容相同。

Classworking 工具箱: 泛型与ASM(4)

时间:2011-10-16 IBM Dennis Sosnoski

ASM 中的泛型

本系列的前几期文章中已介绍过,ASM 使用了一种访问器 (visitor) 模式 来处理二进制类表示。这种访问器模式是双向的:您可以解析一个现有类,得到类组件的处理程序访问器 方法的调用序列,也可以实现对类写入器的访问器方法的同类调用序列,以生成一个二进制类表示。这一 解析器/写入器对称使 ASM 在您仅修改类的特定方面的情况下尤为方便 —— 您可将类写入器 作为类解析器事

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号