11

我正在编写一个摇摆应用程序,我希望在执行某些方法时有“等待”光标。我们可以这样做:

public void someMethod() {
    MainUI.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    //method code
    MainUI.getInstance().setCursor(Cursor.getDefaultCursor());
}

我想要实现的是一个 java 注释,它将在方法执行之前设置等待光标,并在执行后将其设置为正常。所以前面的例子看起来像这样

@WaitCursor    
public void someMethod() {
    //method code
}

我怎样才能做到这一点?也欢迎提出有关解决此问题的其他变体的建议。谢谢!

PS - 我们在我们的项目中使用 Google Guice,但我不知道如何使用它来解决问题。如果有人会为我提供类似问题的简单示例,那将非常有帮助

4

2 回答 2

14

你可以使用 AspectJ,或者使用自带 AOP 的 Google Guice。

具有使用注释注释的方法的对象WaitCursor必须使用 Guice 注入。

你定义你的注释

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface WaitCursor {}

您添加一个 MethodInterceptor :

public class WaitCursorInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        // show the cursor
        MainUI.getInstance().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        // execute the method annotated with `@WaitCursor`
        Object result = invocation.proceed();
        // hide the waiting cursor
        MainUI.getInstance().setCursor(Cursor.getDefaultCursor());
        return result;
    }
}

并定义一个模块,在其中将拦截器绑定到具有注释的任何方法上。

public class WaitCursorModule extends AbstractModule {
    protected void configure() {
        bindInterceptor(Matchers.any(), Matchers.annotatedWith(WaitCursor.class), new WaitCursorInterceptor());
    }
}

您可以在此页面上看到更多高级用途

于 2012-08-30T11:05:41.980 回答
3

您可能希望将AspectJ中的 around() 建议与您的注释结合使用,以将 around() 建议与您的注释限定的所有方法相关联。

于 2012-08-30T10:50:49.290 回答