快速业务通道

Classworking工具箱: 分析泛型数据结构 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
tance() 方法 处理新的数组类型的添加,递归地调用本身来得到数组的项目类型的类型描述。实际的 Java 类的类型则 通过把二进制类表示传递给 SimpleClassDescription 构造函数而生成。

getSignatureInstance() 方法在结构上与 getTypeInstance() 方法很类似,但是如果在前面没有遇 到使用某个泛型类的参数类型的相同组合,它还需要处理到泛型类的类型替换。马上我就要编写实际执行 这个任务的代码,以及相关的 getMappedSignatureInstance() 代码。首先,我要处理的代码负责构建不 带指定参数类型的类的描述。

用 ASM 构建类描述

清单 3 显示了简单类描述的实际构造,所谓简单类,我指的是非泛型类或者不带指定参数类型的泛型 类。这个类的全部工作都发生在构造函数中,构造函数首先把类的新实例添加到类型目录(以处理递归, 就像在 前一节 中讨论的),然后用 ASM 处理实际的二进制类表示,构建一组字段描述。

清单 3. SimpleClassDescription 类

public class SimpleClassDescription extends TypeDescription {    private final String m_name;    private final FieldDescription[] m_fields;    public SimpleClassDescription(String dtor, byte[] byts, TypeDirectory dir)  {      super(dtor);      m_name = BinaryClassLoader.nameFromDescriptor(dtor);      dir.addType(this);      DescriptionBuilderVisitor vtor = new DescriptionBuilderVisitor(dir);      ClassReader creader = new ClassReader(byts);      creader.accept(vtor, true);      m_fields = vtor.getFields();    }    public FieldDescription[] getFields() {      return m_fields;    }    public String toString() {      return m_name;    }    /**     * Visitor for generating the description information for a simple class  (a     * non-generic class, or a generic class used without type  substitution).     * If the class is generic, the bounds information from the signature  is     * substituted for the type parameters.     */    public class DescriptionBuilderVisitor extends EmptyVisitor    {      private final TypeDirectory m_typeDirectory;      private HashMap<String,TypeDescription> m_typeMap;      private ArrayList<FieldDescription> m_fields;      private DescriptionBuilderVisitor(TypeDirectory dir) {        m_typeDirectory = dir;        m_fields = new ArrayList<FieldDescription>();      }      public void visit(int version, int access, String name, String sig,        String sname, String[] inames) {        if (sig != null) {          m_typeMap = new HashMap<String,TypeDescription>();          new SignatureReader(sig).accept(new ClassSignatureVisitor());        }      }      public FieldVisitor visitField(int access, String name, String desc,        String sig, Object value) {        TypeDescription type;        if (sig == null) {          type = m_typeDirectory.getTypeInstance(desc);        } else {          type = m_typ

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