Java的注释前和方法后,执行一些代码(Java annotation to execute som

2019-06-27 13:43发布

我正在写一个Swing应用程序,我想执行的一些方法,当有“等待”光标。 我们可以这样来做:

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 - 我们使用谷歌吉斯在我们的项目,但我不明白如何使用它来解决问题。 如果有人提供给我类似的问题的简单的例子,那将是非常有益的

Answer 1:

您可以使用AspectJ中,或使用谷歌吉斯由此带来了自己的AOP。

有您的注释的方法的对象WaitCursor注释必须吉斯注入。

定义您的注解

@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());
    }
}

你可以看到更高级用法此页



Answer 2:

你可能想看看使用周围的AspectJ()通知连同您的注释到around()通知与有资格与您的注释的所有方法相关联。



文章来源: Java annotation to execute some code before and after method