快速业务通道

体验Java 1.5中面向方面(AOP)编程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
中多次调用的方法。由于重构会给每次方法调用增加一定的开销,我们有必要忽略频繁调用的方法。幸运的是,我们可以使用重构解决这个问题。除了简单地更新StatusManager之外,我们将维护每个重构的方法被调用的次数。如果这个数值超过了某个极限(意味着维护这个方法的信息的开销太大了),取样线程将会永远地取消对该方法的重构。

理想情况下,我将把每个方法的调用数量存储在重构过程中添加到类的新字段中。不幸的是,Java 1.5中增加的类转换机制不允许这样操作;它不能增加或删除任何字段。作为代替,我将把这些信息存储在新的CallCounter类的Method对象的静态映射中。

这种混合的方法可以在示例代码的/code/06_dynamic目录中找到。

概括

图4提供了一个矩形,它显示了我给出的例子相关的特性和代价。

体验Java 1.5中面向方面(AOP)编程 - 编程入门网

图4.重构方法的分析

你可以发现,动态的(Dynamic)方法是各种方案的良好组合。与使用重构的所有示例类似,它提供了方法开始或终止时刻的明确的回调,因此你的应用程序可以准确地跟踪运行时并立即为用户提供反馈信息。但是,它还能够取消某种方法的重构(它被过于频繁地调用),因此它不会受到其它的重构方案遇到的性能问题的影响。它没有包含编译时步骤,并且它没有增加类载入过程中的额外的工作。

未来的趋势

我们可以给这个项目增加大量的附件特性,使它更加适用。其中最有用的特性可能是动态的状态信息。我们可以使用新的java.util.Formatter类把类似printf的模式替换(pattern substitution)用于@Status消息中。例如,我们的connectToDB(String url)方法中的@Status("Connecting to %s")注解可以把URL作为消息的一部分报告给用户。

在源代码重构的帮助下,这可能显得微不足道,因为我将使用的Formatter.format方法使用了可变参数(Java 1.5中增加的"魔术"功能)。重构过的版本类似下面的情形:

public void connectToDB (String url) {   Formatter f = new Formatter();   String message = f.format("Connecting to %s", url);   StatusManager.push(message);   try {    ...   } finally {    StatusManager.pop();   } }

不幸的是,这种"魔术"功能是完全在编译器中实现的。在字节码中,Formatter.format把Object[]作为参数,编译器明确地添加代码来包装每个原始的类型并装配该数组。如果BCEL没有加紧弥补,而我又需要使用字节码重构,我将不得不重新实现这种逻辑。

由于它只能用于重构(这种情况下方法参数是可用的)而不能用于取样,你可能希望在启动的时候重构这些方法,或最少使动态实现偏向于任何方法的重构,还可以在消息中使用替代模式。

你还可以跟踪每个重构的方法调用的启动次数,因此你还可以更加精确地报告每个方法的运行次数。你甚至于可以保存这些次数的历史统计数据,并使用它们形成一个真正的进度条(代替我使用的不确定的版本)。这种能力将赋予你在运行时重构某种方法的一个很好的理由,因为跟踪任何独立的方法的开销都是很能很明显的。

你可以给进度条增加"调试"模式,它不管方法调用是否包含@Status注解,报告取样过程中出现的所有方法调用。这对于任何希望调试死锁或性能问题的开发者来说都是无价之宝。实际上,Java 1.5还为死锁(deadlock)检测提供了一个可编程的API,在应用程序锁住的时候,我们可以使用该API把进程条变成红色。

本文中建立的基于注解的重构框架组件可能很有市场。一个允许字节码在编译时(通过Ant事务)、启动时(使用ClassTransformer)和执行过程中(使用Instrumentation)进行重构的工具对于少量其它新项目来说毫无疑问地非常有价值。

总结

在这几个例子中你可以看到,元数据编程(meta-programming)可

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