我可以使用注解在注解之后调用方法吗?
Can I use annotation to call method after the annotated one?
我想知道是否可以使用自定义注释在注释后立即调用某些方法。例如,我有一个 class 包含一些设置,这些设置还可以通知对象某些内容已更改(例如用户在设置面板中更改了某些内容)。并非所有的侦听器都对所有类型的事件感兴趣,因此 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()
更简单,但我想知道是否可以按照我描述的方式使用注释,如果是的话,可以我得到一些提示?我不期望现成的解决方案,只是提示是否可能以及我应该考虑什么。
在注释中,您需要一个 class 来检查它。他们不为自己工作。
系统检查它们的方式是反射。
Annotation<NotifyAnnotation> a = method.getAnnotation();
并显式调用它们的方法
a.notifyListeners(a.evt);
我看不出你的案例有任何优势。但我看到了很多缺点。它们不应在实际编码中使用,仅用于测试系统或类似场景,其中外部系统可以控制您的 class.
是的,你可以做到,但你必须使用框架或自己编写一个。例如,您可以使用 spring 方面和 @After advice (or any other proxy mechanism). you can also use full aspectj。另一种选择是使用反射自己编写它api。在最后一种情况下,您将需要某种控制反转 - 某种机制将启动您的方法,然后启动另一种方法
可以使用字节码操作(JAssist、Asm、Java Rocks ...)来做到这一点。所有 类 都将通过一个工厂实例化,该工厂将识别带注释的方法,并在此方法的第一行中注入对其注释中指定的方法的调用。
我想知道是否可以使用自定义注释在注释后立即调用某些方法。例如,我有一个 class 包含一些设置,这些设置还可以通知对象某些内容已更改(例如用户在设置面板中更改了某些内容)。并非所有的侦听器都对所有类型的事件感兴趣,因此 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()
更简单,但我想知道是否可以按照我描述的方式使用注释,如果是的话,可以我得到一些提示?我不期望现成的解决方案,只是提示是否可能以及我应该考虑什么。
在注释中,您需要一个 class 来检查它。他们不为自己工作。 系统检查它们的方式是反射。
Annotation<NotifyAnnotation> a = method.getAnnotation();
并显式调用它们的方法
a.notifyListeners(a.evt);
我看不出你的案例有任何优势。但我看到了很多缺点。它们不应在实际编码中使用,仅用于测试系统或类似场景,其中外部系统可以控制您的 class.
是的,你可以做到,但你必须使用框架或自己编写一个。例如,您可以使用 spring 方面和 @After advice (or any other proxy mechanism). you can also use full aspectj。另一种选择是使用反射自己编写它api。在最后一种情况下,您将需要某种控制反转 - 某种机制将启动您的方法,然后启动另一种方法
可以使用字节码操作(JAssist、Asm、Java Rocks ...)来做到这一点。所有 类 都将通过一个工厂实例化,该工厂将识别带注释的方法,并在此方法的第一行中注入对其注释中指定的方法的调用。