快速业务通道

Java理论与实践: 平衡测试,第3部分:用方面检验设计约束 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
))      || call(void JTextPane.setLogicalStyle(..))      || call(void JTextPane.setCharacterAttributes(..))      || call(void JTextPane.setParagraphAttributes(..));   pointcut edtMethods() : (swingMethods() || extendsSwing())  && !safeMethods();   before() : edtMethods() {   if (!SwingUtilities.isEventDispatchThread())    throw new AssertionError(thisJoinPointStaticPart.getSignature ()     + " called from " + Thread.currentThread().getName ());   } }

swingMethods() 切入点包含对 javax.swing 包中的所有方法(包括构 造函数)的调用。extendsSwing() 切入点代表对所有扩展自 JComponent 或任 何 Swing 模型类的类中方法的全部调用。safeMethods() 切入点代表一些已知 可以从任何线程安全调用的 Swing 方法。

SwingThreadAspect 并 不完美,但是足够了。safeMethods() 切入点没有完全枚举线程安全方法,而且 extendsSwing() 切入点可能也没有包含所有经常被扩展的 Swing 类。但是我们 不会把它们用于生产 —— 只是用它们进行测试。它能够不必为每个 程序创建新的测试用例就发现 bug,而这就是它的价值所在。而且,像大多数 bug 探测器一样,它可能会在以前以为是正确的程序中找到 bug。

Java理论与实践: 平衡测试,第3部分:用方面检验设计约束(3)

时间:2010-12-22 IBM Brian Goetz

在调试对象中切换

方面的另一个好应用就是在类的正式版本和 “调试” 版本之间进行切换。创建一个类的调试版本是相当普遍的 情况,例如创建一个带有更多日志或错误检测的版本,这个版本因为副作用或性 能问题而不适合在生产中使用。但是在需要的时候在调试版本中切换,会很烦琐 或者容易出错。如果对象是通过构造函数实例化的,就不得不在代码中找到所有 调用构造函数的地方。缓解修改所有构造函数调用的不方便性的一种常用技术是 ,改用工厂来实例化对象,但是只为了在生产版本和调试版本之间进行选择而使 用工厂,会增加复杂性或带来安全漏洞。

如果目的是为了 “ 在所有实例化 Foo 的地方,都换成实例化 DebuggingFoo”,那么方面为 做这件事提供了非常可靠且不需要修改程序的简单机制。作为示例,清单 4 显 示了一个方面,它有助于发现死锁,把 ReentrantLock 的所有实例化都替换成 DebuggingLock。(请注意,AspectJ 只修改要求 AspectJ 编译器处理的代码中 的调用;Java™ 类库本身中对 ReentrantLock 的实例化不会被替换,除 非特意把方面编织到平台库中。)

清单 4. 把所有 ReentrantLock 的实例化替换成 DebuggingLock 的方面

public aspect ReentrantLockAspect {   pointcut newLock() : call(ReentrantLock.new());   pointcut newLockFair(boolean fair) :     call(ReentrantLock.new(boolean)) && args(fair);   ReentrantLock around() : newLock() {    return new DebuggingLock();   }   ReentrantLock around(boolean fair) : newLockFair(fair) {    return new DebuggingLock (fair);   } }

在 Java SE 6 中,运行时对请求执行死锁检测,通过 java.lang.management 中的 ThreadMXBean 接口,或者在请求线程转储时执行 。清单 5 显示了 DebuggingLock 的一个可能实现,每次请求锁时,都执行死锁 检测,所以可以更迅速地得到死锁的警告。锁定性能要比 ReentrantLock 差, 因为每次试图锁定时要做更多的工作,所以这种方式可能不适合在生产中使用。(而且,维护 waitingFor 数据结构时自带的同步,可能会干

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