快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
代码中可以做的事情有一些限制。第一项限制是使用的格 式,它必须是单条语句或者块。在大多数情况下这算不上是限制,因为可以将所需要的任何 语句序列放到块中。下面是一个使用特殊 Javassist 标识符表示方法中前两个参数的例子, 这个例子用来展示其使用方法:

{   System.out.println("Argument 1: " + $1);   System.out.println("Argument 2: " + $2); }

对于源代码的一项更实质性的限制是不能引用在所添加的声明或者块外声明的局部变量。 这意味着如果在方法开始和结尾处都添加了代码,那么一般不能将在开始处添加的代码中的 信息传递给在结尾处添加的代码。有可能绕过这项限制,但是绕过是很复杂的 -- 通常需要 设法将分别插入的代码合并为一个块。

用 Javassist 进行 Classwo***ng

作为使用 Javassist 的一个例子,我将使用一个通常直接在源代码中处理的任务:测量 执行一个方法所花费的时间。这在源代码中可以容易地完成,只要在方法开始时记录当前时 间、之后在方法结束时再次检查当前时间并计算两个值的差。如果没有源代码,那么得到这 种计时信息就要困难得多。这就是 classwo***ng 方便的地方 -- 它让您对任何方法都可以 作这种改变,并且不需要有源代码。

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

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

清单 1 显示了一个(不好的)示例方法,我用它作为我的计时试验的实验品: StringBuilder 类的 buildString 方法。这个方法使用一种所有 Java 性能优化的高手都会 叫您 不要使用的方法构造一个具有任意长度的 String -- 它通过反复向字符串的结尾附加 单个字符来产生更长的字符串。因为字符串是不可变的,所以这种方法意味着每次新的字符 串都要通过一个循环来构造:使用从老的字符串中拷贝的数据并在结尾添加新的字符。最终 的效果是用这个方法产生更长的字符串时,它的开销越来越大。

清单 1. 需要计时的方法

public class StringBuilder {    private String buildString(int length) {      String result = "";      for (int i = 0; i < length; i++) {        result += (char)(i%26 + ''a'');      }      return result;    }    public static void main(String[] argv) {      StringBuilder inst = new StringBuilder();      for (int i = 0; i < argv.length; i++) {        String result = inst.buildString(Integer.parseInt(argv [i]));        System.out.println("Constructed string of length " +          result.length());      }    } }

添加方法计时

因为有这个方法的源代码,所以我将为您展示如何直接添加计时信息。它也作为使用 Javassist 时的一个模型。清单 2 只展示了 buildString() 方法,其中添加了计时功能。 这里没有多少变化。添加的代码只是将开始时间保存为局部变量,然后在方法结束时计算持 续时间并打印到控制台。

清单 2. 带有计时的方法

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

用 Javassist 来

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