Classworking 工具箱: 泛型与ASM - 编程入门网
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. 参数化类签名示例
由于清单 2 中的类为参数化类型,所以类签名需要 以二进制类形式表示。与源代码相比,签名的文本要长一些,但如果您了解到,源代码中省略的类型参数 的所有可选组件都包含在签名中,那么理解起来也就不太困难了。签名的第一部分(位于尖括号 ‘<...>’ 内)就是该类的类型参数定义清单。这些定义的形式都相同,类型参数名称 后接类型的类边界和接口边界(若存在)的字段描述符。各字段描述符前加 ‘:’ 字符。由 于清单 2 源代码未为类的类型参数指定任何边界,因此其边界均为默认的类边界 java.lang.Object。 类签名的第二部分(尖括号外)给出了超类和超接口(若存在)的签名。在清单 2 所示的例子中 ,未指定任何超类,因此签名以 java.lang.Object 作为超类。这里指定了超接口,为 Iterable<T>。在签名中可以看到预期结果,源代码中使用的只是 ‘<T>’,而 签名中使用的是 ‘<TT;>’。原因在于签名需要区分类名称和类型变量名称,第一个 ‘T’标识紧随其后的内容为类型变量名,而结尾的‘;’ 表示名称结束。 清单 2 中的字段和方法签名利用了与超接口签名相同的变量格式类型,其他都与前面介绍的内容相同。 Classworking 工具箱: 泛型与ASM(4)时间:2011-10-16 IBM Dennis SosnoskiASM 中的泛型 本系列的前几期文章中已介绍过,ASM 使用了一种访问器 (visitor) 模式 来处理二进制类表示。这种访问器模式是双向的:您可以解析一个现有类,得到类组件的处理程序访问器 方法的调用序列,也可以实现对类写入器的访问器方法的同类调用序列,以生成一个二进制类表示。这一 解析器/写入器对称使 ASM 在您仅修改类的特定方面的情况下尤为方便 —— 您可将类写入器 作为类解析器事 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |