2017-03-11 134 views
1

我有以下方法:攔截方法聲明

@OnEvent 
public void onEvent(Event event) { 
} 

現在,我百思不得其解的AspectJ是否可以攔截方法「申報」,即無論其呼叫還是其執行,以提供功能的其他地方。 目標是「吃」這個方法,並將其註冊爲處理事件到OSGi服務註冊表:

public void start(BundleContext bc) { 
    bc.registerService(EventHandler.class, new EventHandler() { 
     @Override 
     public void handleEvent(Event event) { 
      // TODO get a "reference" of the onEvent(...) method and call it here 
      onEventJoinPoint.proceed(event); 
     } 
    }, null); 
} 

回答

0

不,這是AspectJ的概念是不可能的,可能也是在其他任何AOP框架。但你有幾種選擇:

  • 如何將標記註釋放在方面應該踢的所有地方?在那裏你可以參數化註釋以便提及要調用的方法。
  • 或者如果你真的想把它全部放在一個地方,並避免配置文件,使用類似於Spring的配置類。在啓動組件時,您調用的類或其中一種方法會攜帶所有配置註釋,這些註釋因此可被AspectJ攔截。
  • 您也可以將註釋保留在原來的位置,並在加載類後調用帶註釋的方法一次,攔截方法執行並從一個方面記錄方法,然後稍後重新使用該信息。

還有其他類似的選項。但是,在每一種情況下,請注意

  • 類加載/初始化順序很重要,
  • ,如果你只是有一個方法和類的名稱,則需要反思,以調用它,除非該方法爲靜態或類是單例,並且該方法不依賴於任何對象狀態,即可以容易地獲得實例並且根據需要經常調用該方法。然後你甚至可以調整解決方案,多次調用proceed()

如果您有後續問題對於簡單評論過於複雜,請更新主要問題並通知我。現在我不能再具體了,因爲我對你的用例不夠了解。因此,我沒有提供任何示例代碼(還)。

+0

我想我會嘗試爲我的OSGi環境構建一個自定義的編織鉤子。 –