快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-14
进制类表示的输出。我调 用编写器的 visitField() 方法向构建的类添加一个字段,这将返回该字段的一个 visitor。返回的字段 visitor 可以用来为字段添加注释或者特殊的属性信息,但是在这个例子中,我不需要做什么特殊的事情 ,可以只是立即调用字段 visitor 的 visitEnd() 方法。

在添加字段之后,我为构建的类添加了 4 个必要方法。清单 1 中的模板类源代码是类的默认构造函数,第一个方法没有出现在其中。这个构造 函数没有参数,只是调用父类的构造函数,是在没有指定类的构造函数时,由 Java 编译器自动生成的。 因为我自己正在构建一个类,所以我需要显式地创建默认构造函数。其余三个方法与 清单 1 源代码中显 示的方法相同。

在添加字段时,调用类编写器的 visitMethod() 方法将为添加的方法返回一个 visitor。这个方法 visitor(org.objectweb.asm.MethodVisitor 接口的实例)可以用于为方法添加注 释或特殊属性,但是也为生成构成方法主体的实际字节码指令序列提供了接口。清单 1 的代码演示了如 何通过调用方法 visitor 来添加指令。在添加完所有指令后,就可以用最后一对调用来完成方法生成。 第一个调用是 visitMaxs(),它用于设置方法的最大堆栈大小和本地变量计数(这些值也可以由 ASM 自 动计算,并通过在调用中把 true 参数传递给 ClassWriter 构造函数对其进行配置)。最后一对调用中 的第二个调用是 visitEnd(),它只完成方法的构建过程。

一旦添加了字段和方法,获得完成后的 类的二进制代码就很容易。对类编写器调用 visitEnd() 表明类编写过程已经完成,而 toByteArray() 调用实际上返回的是二进制类映像。

检测结果

在“Java 编程动态性,第 8 部分 ” 中,我展示了用 Javassist 和 BCEL 在运行时生成反射替代类所花费时间的计时结果,以及用 反射和替代类执行不同数量的访问所花费时间的计时结果。在这一期中,我将展示同样类型的结果,但稍 有变化。首先,我要把 ASM 包含在生成时间的比较中。我还要转换到 JDK 1.5 中进行测试,以便能够使 用 java.lang.System.nanoTime() 方法获得更精确的计时结果。

图 1 显示了从 2k 到 51k 的循 环中,使用反射方法调用和生成类的时间的比较(测试是在一台 1GHz 的 PIIIm 笔记本上进行的,运行 的是 Mandrake Linux 10.0 系统,使用 Sun 的 1.5.0 JVM)。这些时间对于所有框架都是相同的。使用 生成代码的性能优势看起来并不像我在以前的测试中用 1.4.2 JVM 那么好,但是它们仍然很有意义,因 为生成代码运行起来要比反射快 10 到 14 倍。

图 1. 反射和生成代码速度对比(以毫秒为单位)

图 1 的结果很有趣, 但是它们并不是本期的重点。关系更密切的是表 1 显示的结果,它给出了使用每个框架来构建生成类所 花费的时间。在这里,我为每个框架提供了两个独立的时间。第一个时间值是构建第一个反射替代类所花 费的时间,这个时间包括装载和初始化框架代码中的类的时间。后一个时间值是构建另外三个反射替代类 (针对其他属性)的平均值。

Classworking 工具箱: ASM classworking(5)

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

表 1. 类的构建时间

框架 第一 个时间 第二个时间
Javassist 257 5.2
BCEL 473
ASM 62.4 1.1

表 1 的结果表明 ,ASM 的确比其他框架快,而且这一优势不仅适用于启动时,还适用于重复使用的时候。

结束语

将 ASM 与其他 classworking 框架进行对比,结果显示,它比其

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