快速业务通道

Java编程的动态性, 第4部分: 用Javassist进行类转换 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

来做使用 Javassist 操作类字节码以得到同样的效果看起来应该不难。Javassist 提供 了在方法的开始和结束位置添加代码的方法,别忘了,我在为该方法中加入计时信息就是这 么做的。

不过,还是有障碍。在描述 Javassist 是如何让您添加代码时,我提到添加的代码不能 引用在方法中其他地方定义的局部变量。这种限制使我不能在 Javassist 中使用在源代码中 使用的同样方法实现计时代码,在这种情况下,我在开始时添加的代码中定义了一个新的局 部变量,并在结束处添加的代码中引用这个变量。

那么还有其他方法可以得到同样的效果吗?是的,我 可以在类中添加一个新的成员字段 ,并使用这个字段而不是局部变量。不过,这是一种糟糕的解决方案,在一般性的使用中有 一些限制。例如,考虑在一个递归方法中会发生的事情。每次方法调用自身时,上次保存的 开始时间值就会被覆盖并且丢失。

幸运的是有一种更简洁的解决方案。我可以保持原来方法的代码不变,只改变方法名,然 后用原来的方法名增加一个新方法。这个 拦截器(interceptor)方法可以使用与原来方法同 样的签名,包括返回同样的值。清单 3 展示了通过这种方法改编后源代码看上去的样子:

清单 3. 在源代码中添加一个拦截器方法

private String buildString$impl(int length) {      String result = "";      for (int i = 0; i < length; i++) {        result += (char)(i%26 + ''a'');      }      return result;    }    private String buildString(int length) {      long start = System.currentTimeMillis();      String result = buildString$impl(length);      System.out.println("Call to buildString took " +        (System.currentTimeMillis()-start) + " ms.");      return result;    }

通过 Javassist 可以很好地利用这种使用拦截器方法的方法。因为整个方法是一个块, 所以我可以毫无问题地在正文中定义并且使用局部变量。为拦截器方法生成源代码也很容易 -- 对于任何可能的方法,只需要几个替换。

Java编程的动态性, 第4部分: 用Javassist进行类转换(3)

时间:2011-04-09 IBM Dennis M. Sosnoski

运行拦截

实现添加方法计时的代码要用到在 Javassist 基础中描述的一些 Javassist API。清单 4 展示了该代码,它是一个带有两个命令行参数的应用程序,这两个参数分别给出类名和要 计时的方法名。main() 方法的正文只给出类信息,然后将它传递给 addTiming() 方法以处 理实际的修改。addTiming() 方法首先通过在名字后面附加“ $impl” 重命名现有的方法, 接着用原来的方法名创建该方法的一个拷贝。然后它用含有对经过重命名的原方法的调用的 计时代码替换拷贝方法的正文。

清单4. 用 Javassist 添加拦截器方法

public class JassistTiming {    public static void main(String[] argv) {      if (argv.length == 2) {        try {          // start by getting the class file and method          CtClass clas = ClassPool.getDefault().get(argv[0]);          if (clas == null) {            System.err.println("Class " + argv[0] + " not  found");          } else {            // add timing interceptor to the class            addTiming(clas, argv[1]);            clas.writeFile();           

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