用于调用方法的 Java 注解

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

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

总而言之,我不确定做我想做的事情的最佳风格是什么。以上是我目前的想法。如果有更好的风格来实现这一点,请提出建议。

最佳答案

我怀疑您想要做的事情可以使用 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/

相关文章:

java - 如何使我的 URL 仅为 "localhost:8080/*"?

ios - MKMapView 注释图像更改为单击时固定

java - 如何用Java处理来自客户端的Websocket消息?

java - @RequestBody 注释究竟是如何工作的以及它与 HttpMessageConverter 接口(interface)有何关系?

java - 以编程方式调用注释处理器

spring - 当用@Component注解一个类时,这是否意味着它是一个Spring Bean和Singleton?

java - swing应用程序支持动态代码编译吗?

java - 克隆一个整数

java - 在java中使用绝对路径打开文件

java - 使用 maven-assembly-plugin 创建两个可执行的 jar