我在使用注释来调用注释所属的方法时遇到了一些麻烦......我将举一个例子:
class MyEventHandlers {
@handler(id=“1”)
public doSomething() {
...
}
@handler(id=“2”)
public doSomethingElse() {
...
}
}
....
subscribe(“event1”, new MyEventHandlers, “1”);
//or maybe a better way to do this?!
....
//later, when I detect ‘event1’ I can process the required handler:
process(new MyEventHandlers, “1”)
我的想法是,我想要一种方法来定义事件的处理程序,然后将事件链接到处理程序。 (现在考虑一个事件是一些字符串文字)。
总而言之,我不确定做我想做的事情的最佳风格是什么。以上是我目前的想法。如果有更好的风格来实现这一点,请提出建议。
最佳答案
我怀疑您想要做的事情可以使用 AOP 框架更轻松地实现。
但是既然你可能想自己做:
性能的关键是仅在设置期间使用反射。因此,在订阅
时,您创建一个处理程序描述符并将其添加到该事件的监听器中。处理程序描述符基本上是 java.lang.reflect.Method有一个调用它的实例,以及一些关于如何获取事件数据的知识,即该方法采用什么参数。
这样就可以实现事件触发
for (HandlerDescriptor desc : subscriptionMap.get(event)) {
desc.trigger(event);
}
,应该很快。您可以为获取事件信息的处理程序使用不同的 HandlerDescriptors,...
您还可以通过在类级别缓存 java.lang.reflect.Method
(通过处理程序 id 键)来加快 subscribe
本身的速度。这样,反射仅在订阅
类的方法时使用,以前没有见过。
我在这里不讨论的内容(提示:它是 API 风格)
- 如何命名注释
- 如何获取上下文/事件数据,您可以查看 JAX-RS 。
基本上,您还将在设置时解析该信息,例如通过查看参数类型,这样您就不需要在
.trigger()
时调度它。 - 是否订阅/取消订阅或从订阅返回取消订阅者。 这是古老的事件系统 API 风格问题。
关于用于调用方法的 Java 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6833024/