有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以使用注释在注释后调用方法吗?

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

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) 个答案

  1. # 1 楼答案

    可以使用字节码操作(JAssist、Asm、Java Rocks…)来实现这一点。所有类都将通过一个工厂进行实例化,该工厂将识别带注释的方法,并将在该方法的第一行注入对其注释中指定的方法的调用

  2. # 2 楼答案

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

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

    并显式调用它们的方法

    a.notifyListeners(a.evt);
    

    我看不出你的案子有什么好处。但我看到了很多缺点。它们不应该用在实际的编码中,只用于测试系统或类似的场景,在这些场景中,外部系统可以控制您的类

  3. # 3 楼答案

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