Java 编程的动态性, 第四部分: 用 Javassist 进行类转换
2010-03-18 00:00:00 来源:WEB开发网对于在传递给 Javassist 的源代码中可以做的事情有一些限制。第一项限制是使用的格式,它必须是单条语句或者块。在大多数情况下这算不上是限制,因为可以将所需要的任何语句序列放到块中。下面是一个使用特殊 Javassist 标识符表示方法中前两个参数的例子,这个例子用来展示其使用方法:
{
System.out.println("Argument 1: " + $1);
System.out.println("Argument 2: " + $2);
}
对于源代码的一项更实质性的限制是不能引用在所添加的声明或者块外声明的局部变量。这意味着如果在方法开始和结尾处都添加了代码,那么一般不能将在开始处添加的代码中的信息传递给在结尾处添加的代码。有可能绕过这项限制,但是绕过是很复杂的 -- 通常需要设法将分别插入的代码合并为一个块。
用 Javassist 进行 Classworking
作为使用 Javassist 的一个例子,我将使用一个通常直接在源代码中处理的任务:测量执行一个方法所花费的时间。这在源代码中可以容易地完成,只要在方法开始时记录当前时间、之后在方法结束时再次检查当前时间并计算两个值的差。如果没有源代码,那么得到这种计时信息就要困难得多。这就是 classworking 方便的地方 -- 它让您对任何方法都可以作这种改变,并且不需要有源代码。
清单 1 显示了一个(不好的)示例方法,我用它作为我的计时试验的实验品: StringBuilder 类的 buildString 方法。这个方法使用一种所有 Java 性能优化的高手都会叫您 不要使用的方法构造一个具有任意长度的 String -- 它通过反复向字符串的结尾附加单个字符来产生更长的字符串。因为字符串是不可变的,所以这种方法意味着每次新的字符串都要通过一个循环来构造:使用从老的字符串中拷贝的数据并在结尾添加新的字符。最终的效果是用这个方法产生更长的字符串时,它的开销越来越大。
更多精彩
赞助商链接