快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
escriptor and signature:  Ljava/util/List;   Ljava/util/List<Lcom/sosnoski/generics/DirInfo;>; Field m_lastModify descriptor  and signature:  Ljava/util/Date;  null Method <init>()  descriptor and signature:  (Ljava/io/File;)V  null Method  getDirectories() descriptor and signature:  ()Ljava/util/List;  () Ljava/util/List<Lcom/sosnoski/generics/DirInfo;>; Method getFiles() descriptor  and signature:  ()Ljava/util/List;  () Ljava/util/List<Lcom/sosnoski/generics/FileInfo;>; Method getLastModify()  descriptor and signature:  ()Ljava/util/Date;  null 

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

时间:2011-10-16 IBM Dennis Sosnoski

签名分析

除将签名作为字符串处理外,ASM 还支持在细节级处理签名。 org.objectweb.asm.signature.SignatureReader 类解析一个签名字符串,并生成对 org.objectweb.asm.signature.SignatureVisitor 接口的调用序列。 org.objectweb.asm.signature.SignatureWriter 类实现访问器接口,并从访问器方法调用序列中构建出 签名字符串。

很不幸,细节级接口有些复杂,但其原因在于签名定义的复杂性,而不是 ASM 代码 处理不力。SignatureVisitor 接口展现了这一复杂性,它定义了 16 个可在签名处理过程中包含的独立 方法调用。当然,绝大多数签名仅使用这些方法中的一小部分。

为举例说明 ASM 的细节级签名处 理,我将解析本文前面所讨论的某些签名,从而介绍方法。为此,我编写了 TraceSignatureVisitor 类 ,清单 5 展示了该类的部分代码,该清单中的 AnalyzeSignaturesVisitor 用于驱动签名处理。当 AnalyzeSignaturesVisitor 用做类的访问器时,它会为所发现的各签名创建一个 SignatureReader,将 TraceSignatureVisitor 类的一个实例作为签名组件访问器调用的目标传递。用于解析签名的 SignatureReader 调用取决于签名的形式:对于类和方法签名,恰当的方法是 accept();对于字段签名 ,应使用 acceptType() 调用。

清单 5. 签名分析

public class  TraceSignatureVisitor implements SignatureVisitor {   public void  visitFormalTypeParameter(String name) {     System.out.println("  visitFormalTypeParameter(" + name + ")");   }   public  SignatureVisitor visitClassBound() {     System.out.println(" visitClassBound ()");     return this;   }   public SignatureVisitor  visitInterfaceBound() {     System.out.println(" visitInterfaceBound()");      return this;   }   public SignatureVisitor visitSuperclass()  {     System.out.println(" visitSuperclass()");     return this;    }   public SignatureVisitor visitInterface() {      System.out.println(" visitInterface()");     return this;   }   public SignatureVisitor visitParameterType() {     System.out.println("  visitParameterType()");     return this;   }   ... } public class AnalyzeSignaturesVisitor extends EmptyVisitor {   public  void visit(int version, int access, String name, String sig,     String  sname, String[] inames) {     if (sig != null) {        System.out.println("Class " + 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号