2012-07-08 16 views
23

我可能只是看錯了方向,但我發現註釋處理的JSE文檔非常...稀疏。我想編寫一個註釋處理器來處理帶註釋的字符串字段和局部變量,以便用計算的字符串表達式替換它們。這不應該太複雜,但我在javax.annotation.processing的Javadoc中迷失了方向。如何編寫Java註釋處理程序?

編輯:我需要在編譯時處理註釋,因爲我想修改生成的代碼。它應該用一個計算的String表達式替換帶註釋的常量String表達式。

+0

同意,我的入口點是本教程:http://tutorials.jenkov.com/java-reflection/annotations.html – 2012-07-08 18:39:13

+2

你想在編譯時或運行時處理註釋嗎?請注意,由於javac的一個愚蠢限制,局部變量的註釋是無效的。 – 2012-07-08 18:43:52

+0

我想在編譯時處理它們,所以這顯然只適用於常量字符串表達式。 – 2012-07-08 19:03:38

回答

14

這不能用編譯時註釋處理器完成。編譯時間註釋處理器只能生成新文件(和類),它們不能修改現有類。您可以在運行時進行反射,但嚴格來說,這不稱爲註釋處理。你也不能訪問局部變量。

如果你正在尋找如何編寫一個編譯時註釋處理器退房https://github.com/pellaton/spring-configuration-validation-processor

+0

理論上,您可以使用註釋處理器+ Apache BCEL(或類似的東西)來修改原始.class文件。但這聽起來很混亂。 – vanza 2012-07-08 18:53:13

+0

錯......什麼?使用註釋框架編譯前我無法修改源代碼? – 2012-07-08 19:11:35

+1

我看着鏈接的代碼。顯然它不生成代碼,它只是驗證它。我希望能夠在實際的代碼生成步驟之前修改抽象語法樹。 – 2012-07-08 19:28:07

4
+0

我看了Javassist和ASM。也許他們會完成這項工作,但他們是關於字節碼操作的。我非常希望使用一個工具來允許我操作抽象語法樹。字節代碼操作只是我最後的手段。 – 2012-07-08 22:41:40

+0

好的,在調查了這些選項後,似乎字節碼操作是唯一可行的選擇。接下來的挑戰是將其整合到Maven構建中 - 不僅僅針對我,也針對我的圖書館用戶。 – 2012-07-09 12:53:46

+0

嗯......操縱AST將是_my_最後的手段:) – 2012-07-10 22:50:16

8

這樣做的兩個工具是Project LombokDuctileJ。這兩種工具在問題最初提出時都存在;現在肯定存在其他工具。

關鍵的想法是編寫一個批註處理器,它在代碼生成之前在編譯期間遍歷並修改程序的AST(抽象語法樹)。編譯器不會更改磁盤上的源代碼,但生成的.class文件將反映您的批註處理器所做的更改。

您可能可以根據自己的需要調整其中一種工具,也可以實施受其實施技術啓發的自己的工具。

編譯時處理比類文件處理有兩個優點。一個是編譯器通常擁有比編譯代碼更多的信息。另一個原因是在編譯過程中,所有事情都是一步完成的,而不是要求開發人員在編譯後運行單獨的工具來重寫.class文件。

+0

當然,值得一提的是,兩者都使用hack來修改AST,利用當前Java註釋處理器中的錯誤,利用內部的javac APIs在一些未來的JDK中修復/刪除(這對我來說是一個很大的缺點)。 – 2015-11-11 16:58:56