使用从上下文返回的结果listerlistener返回的eventListener注释的方法的其他注释



看起来像是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,因此您可以使用反射从该类获取methodtargetMethod。从那里您可以获取方法注释。

或多或少(未检查,在此处纯净的记事本)

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

最新更新