快速业务通道

Classworking工具箱: 注释(Annotation)与ASM - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
// ignore anything except the pair defined for toString() use      if ("order".equals(name)) {        m_fieldOrder = ((Integer)value).intValue();      } else if ("text".equals(name)) {        m_fieldText = value.toString();      }    } } package com.sosnoski.asm; import org.objectweb.asm.Type; /**   * Information for field value to be included in string representation.   */ public class FieldInfo implements Comparable {    private final String m_field;    private final Type m_type;    private final int m_order;    private final String m_text;    public FieldInfo(String field, Type type, int order,      String text) {      m_field = field;      m_type = type;      m_order = order;      m_text = text;    }    public String getField() {      return m_field;    }    public Type getType() {      return m_type;    }    public int getOrder() {      return m_order;    }    public String getText() {      return m_text;    }    /* (non-Javadoc)     * @see java.lang.Comparable#compareTo(java.lang.Object)     */    public int compareTo(Object comp) {      if (comp instanceof FieldInfo) {        return m_order - ((FieldInfo)comp).m_order;      } else {        throw new IllegalArgumentException("Wrong type for comparison");      }    } }

Classworking工具箱: 注释(Annotation)与ASM(6)

时间:2011-06-27 IBM Dennis Sosnoski

清单 5 的代码保存了访问字段时的字段信息,因为如果该字段有注释呈现的话,以后将会需要该信息。当访问注释时,该代码审查它是否是 ToString 注释,如果是,设置一个标志,说明当前字段应该被包含在用于生成 toString() 方法的列表中。当访问一个注释名值对时,该代码审查由 ToString 注释定义的两个名称,当找到时,保存每个名称的值。这些名称的真正默认值(与在注释定义中使用的默认值相对)是在字段的 visitor 方法中设置的,所以任意由用户指定的值都将重写这些默认值。

ASM 首先访问字段,接着访问注释和注释值。因为在处理字段的注释时,没有特定的方法可以调用,所以当处理一个新字段和当需要字段的完成列表时,我会调用一个 finishField() 方法。getFields() 方法向调用者提供字段的完成列表,以由注释值所确定的顺序排列。

转换类

清单 6 展示了实现代码的最后部分,它实际上向类添加了 toString() 方法。该代码与 上个月的文章 中使用 ASM 构造一个类的代码类似,但是需要另外构造以修改一个已有的类。这里,ASM 使用的 visitor 方法增加了复杂性 —— 要修改一个已有的类,需要访问所有的当前类目录,并把它传递给类编写者。org.objectweb.asm.ClassAdapter 是针对此目的的一个方便的基类。它实现了对提供的类编写者实例的传递处理,使您可以只重写需要特殊处理的方法。

清单 6. 添加 toString() 方法

package com.sosnoski.asm; import org.objectweb.asm.ClassAdapter; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; /**   * Visitor to add <code>toStr

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