我可以使用注释在带注释的方法之后调用方法吗?

时间:2015-04-27 10:44:44

标签: java annotations

我想知道是否可以使用自定义注释在注释后立即调用某个方法。例如,我有一个类,其中包含一些设置,这些设置也可以通知对象某些内容已更改(例如,用户在设置面板中更改了某些内容)。并非所有听众都对所有类型的事件感兴趣,因此MyEvent是枚举。现在我有这样的结构:

class Settings
{
    private ArrayList<Listeners> listeners;

    private void notifyListeners(MyEvent e)
    {
        // notify all listeners that something was changed
    }

    public void setSomeOption(int value)
    {
        // validate parameter, store it etc.
       notifyListeners(MyEvent.SOME_INTEGER_SETTING_CHANGED);
    }
}

当然,侦听对象必须检查事件的类型并忽略它或执行某些操作,但这不是这种情况。

我很感兴趣,如果我能用注释实现这一点,比如

@NotifyAnnotation(MyEvent.SOME_INTEGER_SETTING_CHANGED)
public void setSomeOption(int value)
{
    // validate parameter, store it etc.
    // NO NEED TO CALL NOTIFY HERE - WILL BE HANDLED BY ANNOTATION
}

在JUnit中,我们有@Before@After注释,我想知道JUnit是否有自己的注释解析器来处理以这种方式注释的方法,或者这种行为可以更简单地完成,因为注释可以是@Retention(value=RUNTIME)

我知道在这个例子中它可能看起来过于复杂并且调用notifyListeners()非常简单,但我不知道注释是否可以按照我描述的方式使用,如果是,可以我得到一些提示?我不希望得到现成的解决方案,只是暗示这是否可行以及我应该考虑什么。

3 个答案:

答案 0 :(得分:1)

在注释中,您需要一个检查它的类。他们不会在自己身上工作。 系统检查它们的方式是反射。

Annotation<NotifyAnnotation> a = method.getAnnotation();

明确调用他们的方法

a.notifyListeners(a.evt);

我无法看到您案件的任何优势。但我看到充满弊端。它们不应该用于实际编码,只适用于测试系统或类似场景,外部系统可以控制您的班级。

答案 1 :(得分:1)

是的,你可以做到,但你必须使用一个框架或自己编写一个。你可以使用例如spring方面和@After advice(或任何其他代理机制)。您也可以使用完整的aspectj。另一种选择是使用反射api自己编写。在最后一种情况下,你需要某种控制反转 - 一些机制将启动你的方法然后另一种方法

答案 2 :(得分:0)

可以使用字节码操作(JAssist,Asm,Java Rocks ......)。所有类都将通过Factory实例化,这将识别带注释的方法,并在此方法的第一行中注入对其注释中指定的方法的调用。