2011-07-26 56 views
0

我有一个小麻烦,以调用该注释涉及到...我会举一个例子方法利用了注解:Java注解调用方法

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

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

总之,我不确定,用什么样的方式来做我想做的事情。以上是我现在所想的。如果有更好的风格来实现这一点,请提出建议。

+0

这里的实际问题是什么 - 对于这样的事情使用注释是否合理,或者如何实际实现将方法调用路由到正确注释方法的逻辑? –

+0

这是第二个:即如何实现逻辑。 – Larry

回答

2

我怀疑你想做什么,可以更容易地用AOP框架实现。

但是因为你可能想自己反正做到这一点:

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

这样就可以实现事件通过

for (HandlerDescriptor desc : subscriptionMap.get(event)) { 
    desc.trigger(event); 
} 

,这应该是足够快触发。您可以为处理程序提供不同的HandlerDescriptor以获取事件信息,...

通过在类级别(通过处理程序id键)缓存java.lang.reflect.Method,您还可以更快地制作subscribe。这样的反射只用于当一个班级的方法,以前没有见过。

什么我不会在这里讨论(提示:它的API的风格)

  • 如何命名注释
  • 如何获得上下文/事件数据,你可以看看JAX-RS为了这。 基本上你也会在安装时解析这些信息,例如通过查看参数类型,以便您不需要为此在.trigger()时间发送。
  • 是否有订阅/取消订阅或退订订阅的订阅者。 这是旧的事件系统API风格问题。