2012-03-26 56 views
2

我的Google foo讓我失望。如果我有一些框架,可以基於註釋做代碼生成,我想同時支持構建時代碼生成,從而使開發人員可以提前編譯它,也見得到生成的內容,甚至可能修改代碼,而且還提供了運行時字節碼一代更多動態的應用程序,例如基於插件的,應用程序,我可以使用ASM存儲這兩個任務,還是我真的需要兩次設定此,有兩個不同的庫?如果可能的話,一個例子的鏈接將受到歡迎。我可以使用與ASM相同的「生成器」生成Java字節碼和源代碼嗎?

回答

3

雖然這並沒有直接回答這個問題,我建議使用Javassist了ASM。

用Javassist您通過生成的源代碼開始時,你只需把它交給了Javassist編譯器轉成字節碼,所以你現在有兩個可用的,沒有任何額外的技巧。另外,恕我直言,爲Javassist生成源代碼比搞亂字節碼和ASM要容易得多。

+0

我可以看到你的觀點。我前段時間看過Javaassist。如果沒有人知道,那麼這可能是我要做的。 – 2012-03-26 08:57:27

+0

我又看了一遍,我不確定如何用Javassist做到這一點。您用來生成類文件的「源代碼」可能包含諸如「$ cflow(...)」之類的東西,因此它不是真正的Java代碼。我只能看到方法來保存CtClass中的編譯類。你確定這是支持嗎? – 2012-03-26 09:29:30

+0

一天之後沒有其他答案。 ASM不可能,所以你可以獲得積分。 – 2012-03-27 11:00:18

1

對於構建時代碼生成,我建議使用Eclipse的Java編譯器,它不具有該開放的API,但它實際上是非常容易使用。你可以看看你如何在這裏使用它:http://git.jetbrains.org/?p=mps/mps.git;a=tree;f=core/kernel/source/jetbrains/mps/compiler;h=6787147e3b36899574f042dd2132a4c08963670e;hb=HEAD(這段代碼主要是由我編寫的)。還有一個如何動態加載編譯類的例子(MyClassLoader內部類)。

+0

我不確定這對我是否有用,但我給你+1的錯字:「你可以*在這裏起訴」LOL! – 2012-03-26 08:55:01