2015-04-27 137 views
0

我想知道如果我可以使用自定義註釋在註釋之後調用某種方法。例如,我有一個類,其中包含一些設置,可以通知對象某些內容已經更改(例如,用戶在設置面板中更改了某些內容)。並非所有的聽衆都對所有類型的事件感興趣,所以MyEvent是enum。現在我有結構是這樣的:註釋後可以使用註釋來調用方法嗎?

當然
class Settings 
{ 
    private ArrayList<Listeners> listeners; 

    private void notifyListeners(MyEvent e) 
    { 
     // notify all listeners that something was changed 
    } 

    public void setSomeOption(int value) 
    { 
     // validate parameter, store it etc. 
     notifyListeners(MyEvent.SOME_INTEGER_SETTING_CHANGED); 
    } 
} 

收聽對象必須檢查事件的類型和忽略它或執行一些動作,但這裏並非如此。

我很感興趣,如果我可以用註解實現這一點,像這樣

@NotifyAnnotation(MyEvent.SOME_INTEGER_SETTING_CHANGED) 
public void setSomeOption(int value) 
{ 
    // validate parameter, store it etc. 
    // NO NEED TO CALL NOTIFY HERE - WILL BE HANDLED BY ANNOTATION 
} 

在JUnit例如,我們有@Before@After註解,我想知道如果的JUnit有自己的註解解析器處理註釋的方法這樣,或者這種行爲可以做得更簡單,因爲註釋可以是@Retention(value=RUNTIME)

我知道在這個例子中它可能看起來過於複雜,並且調用notifyListeners()非常簡單,但我不知道是否可以按照我描述的方式使用註釋,如果是,我可以得到一些提示嗎?我不期望現成的解決方案,只是一個提示,如果這是可能的,我應該考慮什麼。

+0

這(種)聽起來像使用方面。這是你指的是什麼? – Stultuske

+0

@Stultuske我對方面並不是很熟悉,我只在Spring文檔 – Kuba

+0

中閱讀過有關它們的內容。您可以配置「每個方法的名稱都像xxx一樣 - 緊接着是X功能」。全部取決於你如何配置它。 – Stultuske

回答

1

是的,你可以做到這一點,但你必須使用框架或自己寫一個框架。您可以使用例如彈簧方面和@After advice(或任何其他代理機制)。你也可以用這個完整的aspectj。另一種選擇是使用反射API自己編寫它。在最後一種情況下,你將需要某種反轉控制 - 一些機制,將啓動你的方法,然後另一種方法

1

在註釋中,您需要一個類來檢查它。他們不會自己工作。 系統檢查它們的方式是反射。

Annotation<NotifyAnnotation> a = method.getAnnotation(); 

,並明確調用它們的方法

a.notifyListeners(a.evt); 

我看不到你的情況下,任何的優勢。但我看到充滿缺點。它們不應該用於實際編碼中,僅用於測試系統或類似場景,其中外部系統可以控制班級。

+0

感謝您的回答,所以在這種情況下,我將不得不使用反射來獲取帶註釋的方法,然後使用參數I調用我的'notify'方法,我將從註釋中獲取,對吧? – Kuba

0

它可以做到這一點使用字節碼操作(JAssist,Asm,Java Rocks ...)。所有類都將通過一個Factory來實例化,該Factory將識別帶註釋的方法,並在該方法的第一行中注入對其註釋中指定的方法的調用。