Classworking 工具箱: ASM classworking - 编程入门网
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 代码
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |