2011-07-26 88 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風格問題。