2013-06-02 69 views
4

即使花費了很多時間,我也無法理解註釋處理的目的。我能想到Java註釋處理 - 目的和示例

我明白爲什麼需要運行時的註釋,最簡單的例子是:標記接口的

  1. 更換。
  2. 替換某種類型的市場屬性(例如瞬態)
  3. 通常,可以在運行時完成的任何有用性。

但不幸的是,我無法理解在編譯時使用註釋的任何實際示例/原因(除了由JDK提供的默認註釋(例如@Override等))。

我無法理解使用Annotation Processors的'生成代碼'的目的/需求是什麼。

編輯:Javadoc /自定義Java文檔是我能想到的使用註釋處理程序的目的之一。

+0

這是關於在編譯時使用註釋的一般概念,或關於javax.annotation.processing API以及它們用於什麼的問題? –

+0

編譯時對註釋的一般處理。 –

回答

4

這可以用於各種事情。

兩個簡單的例子

  1. Lombock project。厭倦了編寫成千上萬的獲取者和安裝者?爲什麼不讓註釋處理器在編譯時執行它。
  2. AOP。您可以使用類似AspectJ的東西來編織依賴於註釋的代碼。這將在編譯後完成,但作爲編譯過程的一部分。例如Spring AOP@Transactional註釋與AspectJ結合使用,可以在標註有註釋的方法上編織事務代碼。

還有許多其他用途,但它們通常分解成兩類

  1. 爲了降低鍋爐板代碼。
  2. 針對橫切關注。
+0

感謝您的解釋。 「Lombock項目」很有意義。但我認爲@Transactional是一個「運行時間屬性」。你的意思是Spring AOP對源代碼執行Annotation Processing並更新代碼使其成爲事務性的? –

+0

[它可以,是](http://www.mkyong.com/spring3/spring-aop-aspectj-annotation-example/)。嚴格地說,替代方案是_load time_weaving。所以當這個類被加載時。 –

1

註解處理環境有兩個主要目的 - 分析和代碼生成。

該分析允許您擴展java編譯器的功能,分析正在編譯的程序元素,可能會添加額外的約束,驗證以及報告違反這些約束的錯誤和警告。

代碼生成允許您從現有手寫代碼中的信號中生成額外的補充代碼,主要是(但不是唯一地)鍵入註釋。

一些例子包括Dagger,這是一個編譯時分析依賴注入系統,報告錯誤和警告,通常在運行時找到,而不是在編譯代碼時發現。 Dagger還可以生成所有通常使用反射或通過手寫膠水代碼來完成的代碼,從而提供實質性的好處(在某些情況下)以及可用於逐步調試的基礎結構代碼等。

另一個例子是後者評估各種針對你的代碼檢查,包括空安全的Checker Framework

第三個例子是Auto-Value旨在使較小的值類型幾乎微不足道寫。

註解處理環境決定不適合的一件事是現有代碼就地變異或修改當前正在編譯的代碼。雖然有些項目會這樣做,但他們實際上並未使用註釋處理器API,而是將其轉換爲內部編譯器類型來執行此操作。雖然這顯然是可能的,但它可能很脆弱,並且可能無法可靠地從不同版本或編譯器轉換爲編譯器,因此需要對每個版本和編譯器供應商進行自定義處理。