2012-05-14 22 views
12

我有很多處理特定消息類型的處理程序類。要註冊所有這些處理程序,我需要知道哪些處理程序存在。目前,它們都使用特定的註釋進行註釋,並且我使用Java 6註釋處理器來獲取所有註釋,並創建一個Register類,該類包含每個註釋類型的實例。如何使用註釋處理程序檢查整個源代碼樹?

如果一次構建整棵樹,但是如果只生成一個帶註釋的類(例如,在Eclipse中保存文件時),這種方法將很有效,處理器只能看到該類型,並且構建不完整的註冊表。我如何在這種情況下檢查其他類型?

+0

您使用哪種註釋處理器? –

+0

一個我自己寫的,使用Java 6 API(擴展javax.annotation.processing.AbstractProcessor) –

+0

+1。從我自己的調查來看,這是不可用的,但如果是這樣的話,我真的很想知道它。 –

回答

6

我已經很好地解決了這個問題。我所做的只是一點小事,但基本上對於我看到的每個帶註釋的類,我都將其名稱添加到HashSet中。然後我使用Filer.getResource()打開一個文件,其中記錄了所有以前看到的帶註釋的類,並將它們添加到HashSet中。然後我生成寄存器類,並使用Filer.createResource()將整個HashSet寫入相同的資源。這會導致問題,如果我刪除一個註釋類型,因爲它仍然會記錄在該文件中,但我可以清理該項目或刪除該文件來解決它。編輯:另外,我認爲將相應的「源元素」傳遞給Filer.createSource()應該允許Eclipse正確跟蹤這些依賴關係,但它不會。也許這是一個Eclipse錯誤。

+0

你碰巧有這個代碼在任何地方共享?我對你的方法很感興趣。 –

+0

這是公司擁有的代碼,但如果我曾經爲個人項目編寫過這樣的代碼,它將可用 –

+0

我已經編寫了[generic library](https://github.com/sentinelt/evo-classindex)for這個。我發現這個網頁,因爲我的圖書館遭受同樣的問題... –

1

不出所料,編譯時註釋處理器只處理正在編譯的文件。 Eclipse使用漸進式編譯來節省時間,所以簡短的回答是,您不能指望註釋處理器在一次傳遞中看到所有類型。

一個解決方案是更改您的架構以支持增量編譯。例如,對於每個帶註釋的HandlerClass,生成一個註冊該處理程序類的RegisterHandlerClass類。

這就是說,聽起來像你正在做的事情會在運行時更好地完成,也許藉助於像Reflections這樣的工具。

+1

這是Android代碼,它看起來像大多數這些框架不適用於Android;無論如何,如果可能的話,我想避免類路徑掃描。 如果我去了RegisterHandlerClass路線,那會有幫助嗎?我怎麼才能讓這些類註冊適當的處理程序類,而不必擁有「寄存器」這樣的話? –

+0

如果問題是處理程序類沒有被加載,那麼我的RegisterHandlerClass想法也不會工作。您可以爲每個Handler Class創建一個資源文件,並將它們全部放在同一個目錄中,然後在運行時掃描該目錄。 –

相關問題