看起来像是applicationListEnermethodapter隐藏了它的注释方法,因为它不可能看待该方法是否可能包含其他注释。还有其他一些方法?
如果我有这样的事件听众
@EventListener
@SomeOtherAnnotation
public void onSomeEvent(SomeEvent e) {
...
}
和一个自定义事件多层级
public class CustomEventMulticaster extends SimpleApplicationEventMulticaster {
public <T extends ApplicationEvent> void trigger(final T event,
Function<ApplicationListener<T>, Boolean> allowListener) {
...
}
}
我只想在某些注释存在
时才做触发之类的事情customEventMulticaster.trigger(someEvent, (listener) -> {
return listener.getClass().getAnnotation(SomeOtherAnnotation.class) == null;
})
有一个黑客解决方案 - 就像案例研究一样 - 但请不要那样走。
由于您的应用程序listener
实际上是ApplicationListenerMethodAdapter
,因此您可以使用反射从该类获取method
或targetMethod
。从那里您可以获取方法注释。
或多或少(未检查,在此处纯净的记事本)
customEventMulticaster.trigger(someEvent, (listener) -> {
Field f=((ApplicationListenerMethodAdapter)listener).getDeclaredField("method"); // or 'targetMethod' - consult ApplicationListenerMethodAdapter to get the difference
f.setAccessible(true);
Method m=f.get(listener); // cast again if required
anno=m.getAnnotation(yourAnno); // here you can access annotation
return anno == null;
})
至少要假装ot是安全的,请添加空检查,并检查听众是否确实可以铸入ApplicationListenerMethodAdapter