用于调用方法的Java注释

时间:2011-07-26 16:00:49

标签: java annotations

为了调用注释所涉及的方法,我在注释中使用时遇到了一些麻烦......我将举例说明:

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”)

我的想法是,我希望有一种方法可以定义事件的处理程序,然后将事件链接到处理程序。 (现在考虑事件是一些字符串文字)。

总之,我不确定,用于做我想做的事情的最佳风格是什么。以上就是我现在想的。如果有更好的风格来实现这一点,请建议。

1 个答案:

答案 0 :(得分:2)

我怀疑使用AOP框架可以更轻松地实现您想要做的事情。

但是既然你可能想要自己做这件事:

性能的关键是仅在设置期间使用反射。因此,当subscribe时,您创建一个处理程序描述符并将其添加到事件的侦听器中。处理程序描述符基本上是java.lang.reflect.Method,其中有一个实例可以调用它,以及一些关于如何获取事件数据的知识,即该方法采用的参数。

这样您就可以通过

实现事件触发
for (HandlerDescriptor desc : subscriptionMap.get(event)) {
    desc.trigger(event);
}

,应该足够快。您可以为处理事件信息的处理程序提供不同的HandlerDescriptors,...

您还可以通过在类级别(通过处理程序ID键)缓存subscribe来更快地使java.lang.reflect.Method更快。这种反射仅在subscribe类的方法时使用,而不是之前见过的。

我在这里没有讨论(提示:它的API风格)

  • 如何命名注释
  • 如何获取上下文/事件数据,你可以看一下JAX-RS。 基本上你也会在设置时解析这些信息,例如通过查看参数类型,您无需在.trigger()时间为此进行调度。
  • 是否订阅/取消订阅或从订阅返回Unsubscriber。 那是古老的事件系统api风格问题。