在运行时在事件调度线程上摇摆验证代码
问题内容:
是否有任何库可以检测代码以验证是否在事件调度线程上调用了在Swing组件上调用的方法?编写一些基本的代码来执行此操作可能不会很困难,但是我敢肯定,存在一些极端情况,其他人已经处理过了。我在运行时而不是在单元测试中寻找它。
问题答案:
该FEST框架有一个工具来检测摇摆使用关EDT。基本上是您安装的RepaintManager。该框架面向测试,但是可以在部署时使用RepaintManager。
或者,要检查诸如getter和setter之类的所有方法仅可在EDT上访问,可以使用AspectJ和加载时编织将SwingUtilities.isDisaptchThread()建议添加到swing组件(和JDK
Swing组件)的每个方法上。 )
@Aspect
public class EDTCheck {
@Pointcut("call (* javax.swing..*+.*(..)) || " +
"call (javax.swing..*+.new(..))")
public void swingMethods() {}
@Pointcut("call (* com.mystuff.swing..*+.*(..)) || " +
"call (com.mystuff.swing..*+.new(..))")
public void mySwingMethods() {}
@Pointcut("call (* javax.swing..*+.add*Listener(..)) || " +
"call (* javax.swing..*+.remove*Listener(..)) || " +
"call (void javax.swing.JComponent+.setText(java.lang.String))")
public void safeMethods() {}
@Before("(swingMethods() || mySwingMethods()) && !safeMethods()")
public void checkCallingThread(JoinPoint.StaticPart thisJoinPointStatic) {
if(!SwingUtilities.isDispatchThread()) {
System.out.println(
"Swing single thread rule violation: "
+ thisJoinPointStatic);
Thread.dumpStack();
// or you might throw an unchecked exception
}
}
}
(在文章中稍作修改-
添加了mySwingMethods切入点,并使用SwingUtiliites.isDispatchThread()。实际上,它与EventQueue.isDispatchThread()相同,但是抽象更干净。)