WEB开发网
开发学院软件开发Java Java 编程的动态性, 第四部分: 用 Javassist 进行... 阅读

Java 编程的动态性, 第四部分: 用 Javassist 进行类转换

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 构造拦截器方法的正文时使用一个 java.lang.StringBuffer 来累积正文文本(这显示了处理 String 的构造的正确方法,与在 StringBuilder 的构造中使用的方法是相对的),Java 编程的动态性, 第四部分: 用 Javassist 进行类转换(7),这种变化取决

构造拦截器方法的正文时使用一个 java.lang.StringBuffer 来累积正文文本(这显示了处理 String 的构造的正确方法,与在 StringBuilder 的构造中使用的方法是相对的)。这种变化取决于原来的方法是否有返回值。如果它 有返回值,那么构造的代码就将这个值保存在局部变量中,这样在拦截器方法结束时就可以返回它。如果原来的方法类型为 void ,那么就什么也不需要保存,也不用在拦截器方法中返回任何内容。

除了对(重命名的)原来方法的调用,实际的正文内容看起来就像标准的 Java 代码。它是代码中的 body.append(nname + "($$);\n") 这一行,其中 nname 是原来方法修改后的名字。在调用中使用的 $$ 标识符是 Javassist 表示正在构造的方法的一系列参数的方式。通过在对原来方法的调用中使用这个标识符,在调用拦截器方法时提供的参数就可以传递给原来的方法。

清单 5 展示了首先运行未修改过的 StringBuilder 程序、然后运行 JassistTiming 程序以添加计时信息、最后运行修改后的 StringBuilder 程序的结果。可以看到修改后的 StringBuilder 运行时会报告执行的时间,还可以看到因为字符串构造代码效率低下而导致的时间增加远远快于因为构造的字符串长度的增加而导致的时间增加。

清单 5. 运行这个程序

[dennis]$ java StringBuilder 1000 2000 4000 8000 16000 
Constructed string of length 1000 
Constructed string of length 2000 
Constructed string of length 4000 
Constructed string of length 8000 
Constructed string of length 16000 
[dennis]$ java -cp javassist.jar:. JassistTiming StringBuilder buildString 
Interceptor method body: 
{ 
long start = System.currentTimeMillis(); 
java.lang.String result = buildString$impl($$); 
System.out.println("Call to method buildString took " + 
 (System.currentTimeMillis()-start) + " ms."); 
return result; 
} 
Added timing to method StringBuilder.buildString 
[dennis]$ java StringBuilder 1000 2000 4000 8000 16000 
Call to method buildString took 37 ms. 
Constructed string of length 1000 
Call to method buildString took 59 ms. 
Constructed string of length 2000 
Call to method buildString took 181 ms. 
Constructed string of length 4000 
Call to method buildString took 863 ms. 
Constructed string of length 8000 
Call to method buildString took 4154 ms. 
Constructed string of length 16000 

上一页  2 3 4 5 6 7 8 9  下一页

Tags:Java 编程 动态性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接