快速业务通道

Classworking 工具箱: ASM classworking - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
c void  setValue(int value); } public class AccessValue1 implements IAccess {   private HolderBean m_target;   public void setTarget(Object target)  {     m_target = (HolderBean)target;   }   public int getValue () {     return m_target.getValue1();   }   public void setValue (int value) {     m_target.setValue1(value);   } }

如果 不得不手工编码诸如清单 1 中的 AccessValue1 那样的每个实现类,那么整个方法可能都不是很有用。 但是 AccessValue1 中的代码非常简单,这使它成为运行时类生成的理想目标。可以使用 AccessValue1 字节码作为模板,以生成特定于具体目标对象类型和 get/set 方法对的类,只要用这些目标替换掉 AccessValue1 中使用的那些目标即可。这是我在以前的文章中使用的方法,也是我在这一期中用在 ASM 上的方法。

Classworking 工具箱: ASM classworking(2)

时间:2011-10-16 IBM Dennis M. Sosnoski

使用 ASM

我在前面的文章中介绍的两个 classworking 框架采用了截然不同的 两种方法来处理字节码。Javassist 使用 Java 源代码的简化版本,然后再把代码编译成字节码。这让 Javassist 很容易使用,但是这也把字节码的使用范围限制在了 Javassist 源代码的限制使用范围中。 另一方面,BCEL 直接处理字节码。BCEL 提供了操纵字节码指令的结构和技术,把它从单纯二进制值的级 别提高了一步,但是使用它要比使用 Javassist 难得多。

从操作级别上看,ASM 更靠近 BCEL 而 不是 Javassist,但是 ASM 采用了一种比 BCEL 更整洁的接口。原因之一在于 ASM 的基本设计。ASM 并 不直接操纵字节码指令,而是采用 visitor 模式把类数据(包括指令序列) 当成事件流来处理。在解码 现有类的时候,ASM 会为您生成事件流,并调用处理事件的方法。在生成新类的时候,这种处理方式就反 过来了 —— 您调用 ASM 类,它根据调用所表示的事件流构建新类。也可以使用双向方法, 截住由现有类生成的事件流,做一些修改,并把修改后的事件流送回生成新类的事件流。

用 ASM 修改类

BCEL 和 ASM 都配备了能够生成 Java 源代码以编写类的工具。这些工具背后的思路是: 可以将现有的类用作生成运行时类的模板。生成的源代码包含重新生成模板类的二进制形式所必需的所有 调用,所以从理论上讲,可以把这个代码合并到应用程序代码中,并修改它来满足需要(例如,以参数的 形式替换那些需要在运行时修改的值)。

而在实践中,我发现这种类编写程序的 BCEL 版本 (org.apache.bcel.util.BCELifier)使用起来有一些限制。用于操纵指令列表的 BCEL 代码很复杂,对 我来说,BCELifier 生成的源代码太难看,无法使用。ASM 的类编写程序也会产生一些难看的代码,但是 只需稍做整理,它看起来就有用了。清单 2 显示了在 清单 1 的 gen.AccessValue1 类上运行该程序 (org.objectweb.asm.util.ASMifierClassVisitor)所产生的结果。

清单 2. 从 gen.AccessValue1 生成的 ASM 代码

package asm.gen; import  org.objectweb.asm.*; public class AccessValue1Dump implements Opcodes { public static byte[] dump () throws Exception { ClassWriter cw = new  ClassWriter(false); FieldVisitor fv; MethodVisitor mv; AnnotationVisitor  av0; cw.visit(V1_2, ACC_PUBLIC + ACC_SUPER, "gen/AccessValue1", null,  "java/lang/Object", new String[]   { "gen/IAccess" }); cw.visitSource ("AccessValue1.java", null); { fv = cw.visitField(0, "m_bea

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