我對其他人建議的類路徑掃描程序並不熟悉。他們看起來像一個強大的,如果不是理想的解決方案。
如果您可以控制源,那麼您可以使用註釋處理。
創建一個註釋處理器,該註釋處理器將創建一個具有靜態成員Map<String,Foo>
的類 - MapClass
。註釋處理器每次遇到@Name註釋時,都會將其添加到源代碼MapClass
。當它完成處理註釋時,它將具有與硬編碼地圖相同的效果。
註釋處理髮生在編譯期間。如果項目中的某些類不是由您編譯的。例如,如果其他人編譯一些類並給你一個罐子,那麼它不會很容易工作。但是,如果所有的類都由您編譯,那麼它不應該是一個問題。
要創建註釋處理器,請擴展AbstractProcessor
。您需要使用@ SupportedAnnotationTypes ("Name")
批註註釋您的課程(確保名稱是註釋的完全限定名稱。
覆蓋process
方法。 process
有兩個參數:annotations
和roundEnv
。 annotations
只是這個特定處理器支持的一組註釋 - 在你的情況下它應該是(Name)。 roundEnv
是一個有用的工具類。
迭代annotations
中的一個註釋。使用roundEnv
至getElementsAnnotatedWith
。這應該給你帶有@Name
註釋的所有元素的集合。
AbstractProcessor
還有另一個實用程序成員 - processingEnv
。使用其getFiler
方法createSourceFile
。
然後你必須稍微修改一下你的編譯。您必須分別在其他課程之前編譯處理器。在編譯處理器並編譯其他類之後,必須告訴編譯器關於處理器的信息。如果您正在使用命令行,則可以添加-processorpath /path/to/processor/class[es]
和-processor qualified.name.of.processor
。
這種方法優於類路徑掃描程序的優點是,所有事情都發生在編譯時。例如,如果您不小心將一個@Name
註釋添加到Bar
元素,則可以讓處理器發出編譯時錯誤(如果希望處理器可以忽略它)。然後你可以在產品發貨前修好它。使用類路徑掃描程序時,拋出的任何錯誤都是運行時錯誤 - 用戶將看到。
這種方法的缺點是,一切都發生在編譯時。這使得向項目動態添加類變得更加困難。
在java中?使用find + grep – ControlAltDel 2012-04-01 00:16:11
@ user1291492,使用unix cmd行應該非常容易,保留時間爲RUNTIME。該方法可能會或可能不會訪問源代碼。 OTH,也許這個類文件是可以greppable的。 – emory 2012-04-01 05:18:15
稍有偏離主題,但你爲什麼要'Set'。有一個'Map '或名稱的重點似乎更有意義。 –
emory
2012-04-01 05:20:49