2012-05-07 105 views
25

我想轉換 java源代碼在編譯時就在將源代碼傳遞給編譯器之前。換句話說,我想創建一個預處理能夠改變Java代碼在編譯時轉換

"bla bla bla" 

到任何其他代碼,例如:

new MyClass("bla", 3) 

我的實際動機是爲了做字符串加密,explained here

有些人建議編寫自定義註釋處理器,但據我瞭解註釋:

  • 它們可以用於生成新的類文件,但不會在傳遞給編譯器之前轉換現有的代碼。
  • 它們似乎在包,類或方法級別工作,而不是方法體/實現。

有人建議使用像Spoon或ObjectsWeb ASM這樣的框架,但這些框架在現有代碼庫上學習和部署似乎很複雜。

我茁壯成長地爲這兩種方法找到一個簡單的java代碼預處理示例。

有沒有人看到任何智能的代碼轉換方式,沒有完全改變現有的大型代碼庫與多個常春藤模塊?註釋似乎是最好的方式,但我不明白該怎麼做。

+0

[噴氣機(http://www.eclipse.org/articles/Article-JET/jet_tutorial1.html)可能會有所幫助(我不知道在哪個國家是這樣,但行之有效的一些多年前)。 JavaCC確實遵循相同的方法。 – home

+3

你可以編寫一個自定義的Ant/Mavin插件,它首先執行加密,然後編譯你的代碼。 – Pushkar

+0

我有同樣的問題。你可以分享你最終的結果嗎? – rahulmohan

回答

1

有人已經在python/jython中編寫了一個類似C的預處理器小插件。你可以找到它here。請注意,我從來沒有使用過它,但也許它可能是您的需求的一個很好的起點。

在google代碼中也有一個java-comment-preprocessor maven插件(類似風格),這也可能是一個有用的起點。

祝你好運。聽起來像是一個有趣的挑戰。當然,請記住,混淆只是使提取字符串更具挑戰性,但仍然不是不可能的。如果你真的想讓它變得更加困難,那麼你可能需要考慮加密你的字符串和/或使用AOP。

9

我想你可以嘗試在Project Lombok

使用相同的技術,它是由約作者在this interview解釋說:

什麼是引擎蓋下回事?也就是說,如何在字體代碼中導致樣板註釋結束?

Reinier:註釋處理器API只允許您創建新文件,它不允許您修改其中包含註釋的文件。這就是Lombok所做的,所以Lombok不使用註釋處理器API。

相反,Lombok僅將註釋處理器API用作注入自身到編譯過程的機制。所有的註釋處理器在編譯過程中都會初始化,當Lombok初始化爲註釋處理器時,它會修改javac。我們只改變一件事:AST(原始的源代碼,解析成樹形式)首先傳遞給Lombok,它在javac繼續之前生成需要生成的任何需求。

How does lombok work?

也有可能以項目龍目島擴展到您的需求