6

我有一個自定義註釋,我已經實現了,我想使用註釋處理器來生成我的應用程序中使用的所有類的列表,使用該特定的註釋。使用註釋處理器創建一個具有特定註釋的類的列表

我找到了this tutorial,它描述瞭如何使用註釋處理器生成一個類文件,因此使用我的註釋爲每個類生成一個類應該相當容易。

我無法弄清楚的是我如何將所有這些信息收集到一個類中。似乎沒有辦法修改某個類,所以一旦該類第一次生成後,我就不能將新項添加到列表中。

有沒有辦法使用註釋處理器來生成一個方法,該方法將返回應用程序中所有使用特定註釋註釋的類的列表?

回答

4

生成的類不一定必須與正在處理的輸入類一一對應。另外,你可以搜索的註釋與通過RoundEnvironment一個給定的註釋類(元):

roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class) 

從這個就可以生成一個單獨的類與返回找到的類的集合的方法。

解決此一對夫婦的問題突出:

  • 註解處理器可以與其他註釋處理器一起運行,從而不得不面對在編譯時生成的類。爲了解決這個問題,Java註釋處理是輪流執行的,以允許處理器捕獲其他的輸出。爲了與其他處理器兼容,您需要優雅地處理ErrorType
  • 只有當前編譯階段的類纔會從RoundEnvironmnet方法返回,因此不會包含外部庫中的類。
  • IDE(咳嗽咳嗽Eclipse)不同地實現了Java的註釋處理工具,這對於需要像我描述的完全非部分編譯的處理器來說可能是一個問題。

巧合的是,我創建了一個類似的項目最近已經做了你在找什麼:

https://github.com/johncarl81/silver

銀是一個很有製品和使用了大量的庫代碼來完成任務,但它可能會讓你知道什麼是可能的。

+1

嘿約翰!很高興收到您的答覆:) Silver看起來相當不錯,SilverUtils.getAnnotated()的運行時影響是什麼?另外,如果有的話,它是否必須在運行時拉到類加載器之外,而不是註釋類? – emmby

+0

也很高興收到你的消息Mike!這種方法最酷的地方在於運行時速度儘可能快。一旦你有了Example的一個實例,唯一的運行時成本就是返回一個靜態變量。 SiverUtil.get()對查找類(對Class.forName()的一次調用)做了一點反映,但是這個調用被緩存了,因此只做了一次。無論如何,SilverUtil真的很方便,在技術上你不必使用它來使用生成的代碼。 –