快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
type.getInternalName(), "toString",            "()Ljava/lang/String;");          mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,            "java/lang/StringBuffer", "append",            "(Ljava/lang/String;)Ljava/lang/StringBuffer;");        } else {          // append other types directly to StringBuffer          mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,            "java/lang/StringBuffer", "append", "(" +            type.getDescriptor() + ")Ljava/lang/StringBuffer;");        }        newline = isobj;      }      // finish the method by returning accumulated text      mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuffer",        "toString", "()Ljava/lang/String;");      mv.visitInsn(Opcodes.ARETURN);      mv.visitMaxs(3, 1);      mv.visitEnd();      super.visitEnd();    } }

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

时间:2011-06-27 IBM Dennis Sosnoski

在清单 6 中,需要重写的惟一方法就是 visitEnd() 方法。该方法在所有的已有类信息都已经被访问之后调用,所以它对于添加新内容非常方便。我已经用 visitEnd() 方法向正在处理的类添加 toString() 方法。在代码生成中,我已经添加了一些用于精密地格式化 toString() 输出的特性,但是基本原理很简单 —— 只是循环遍历字段数组,生成代码,该代码首先向 StringBuffer 实例追加前导文本,然后追加实际字段值。

因为当前的代码将只使用 J2SE 5.0(由于使用了 instrumentation 方法来截获 classloading),所以我本应该使用新的 StringBuilder 类作为 StringBuffer 的更有效的等价物。我之所以选择使用以前的方案,是因为下一篇文章中我将使用该代码进行一些后续工作,但是您应该记住 StringBuilder 以便用于您自己的特定于 J2SE 5.0 的代码。

运行 ToString

清单 7 展示了 ToString 注释的一些测试类。我对实际注释使用了混合样式,在一些情况中指定了名值对,而其他的则只使用注释本身。Run 类创建带示例数据的 Customer 类实例,并打印出 toString() 方法调用的结果。

清单 7. ToString 的测试类

package com.sosnoski.dwct; import com.sosnoski.asm.ToString; public class Customer {    @ToString(order=1, text="#") private long m_number;    @ToString() private String m_homePhone;    @ToString() private String m_dayPhone;    @ToString(order=2) private Name m_name;    @ToString(order=3) private Address m_address;    public Customer() {}    public Customer(long number, Name name, Address address, String homeph,      String dayph) {      m_number = number;      m_name = name;      m_address = address;      m_homePhone = homeph;      m_dayPhone = dayph;    }    ... } ... public class Address {    @ToString private String m_street;    @ToString private String m_city;    @ToString private String m_state;    @ToString private String m_zip;    public Address() {}   

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