2008-12-04 72 views
6

我有一個後期編譯步驟,用於處理生成的類的Java字節碼。我希望爲圖書館消費者儘可能地減輕痛苦,所以我正在研究如何使這個過程自動化並且(如果可能的話)編譯器不可知。插入到Java編譯器中

Annotation Processing API提供了許多所需的功能(自動服務發現;由Eclipse支持)。不幸的是,這是針對碼發生器和doesn't support manipulation of existing artefacts

初始輸入到工具被 認爲是由第零 輪被創建;因此,嘗試創建 源文件或類文件對應的 其中一個輸入將導致 FilerException。

API推薦的裝飾模式不是選項。

我可以看到如何使用運行時代理/工具執行此步驟,但這比手動構建步驟更糟糕,因爲它要求任何人甚至在API的外圍接觸點都將它們的JVM配置爲非明顯方式。

javac所示,是否可以插入或包裝compiler tool?有沒有人成功地顛覆了註釋處理器來操縱字節碼,不管文檔說什麼?

回答

4

Groovy編譯器是唯一的字節代碼編譯器,其允許掛鉤到編譯過程(例如:Generate bytecode to support the Singleton pattern

註釋處理API不意味着改變代碼。正如你已經發現的,你所能做的就是安裝一個類加載器,在運行時檢查字節碼並對其進行處理。這是braindead,但它的作品。這遵循一般的「我們害怕開發人員可能會嘗試一些愚蠢的」主題,您會在整個Java中找到它。沒有辦法擴展javac。相關的類是私有的,最終的或將隨着Java的下一個版本而改變。

另一種選擇是編寫帶註釋的Java,例如您編寫了一個類「ExampleTpl.java」。然後,您使用預編譯器來擴展該文件中的註釋以獲取「Example.java」。在其餘代碼中,您使用Example並忽略ExampleTpl

對於Eclipse,有一個bug report to automate this step。我不知道這方面有任何其他工作。

3

它可以做到。

看看我的博客文章Roman Numerals, in our Java其中使用註釋處理器來重寫代碼。有限的是,它只適用於Sun的javac。

+0

您的鏈接已死亡。 – 2016-03-14 17:24:02