2008-10-13 45 views
10

我怎麼能產生在運行時從一個字符串的字節碼(字節[]),而不使用「javac的」過程或這種東西嗎?有沒有一種簡單的方式來調用編譯器?Java的內存編譯

後來添加:

我選擇了accept the solution that actually best fits my situation。我的應用程序是一個仍處於設計草圖階段的業餘愛好項目,現在是考慮插入新技術的正確時機。另外,由於應該幫助BL的人是JavaScript開發人員,在這種情況下,使用JavaScript解釋器而不是stub編譯器+ classLoader的想法似乎更吸引我。這個問題的其他(未被接受的)答案是信息豐富的,據我所知,回答我的問題很好,謝謝,但我要去嘗試Rhino :)

回答

4

你可能會發現像犀牛或時髦在實踐中更有用。

+0

雖然你沒有技術上回答我的問題,你爲我打開了新的可能性,我認爲將證明在實踐中更多有用的(儘管這將需要更多的學習)。我的感謝!(+ upvove) – 2008-10-14 11:29:52

+1

也許我應該更清楚一點,我自己也經歷了同樣的思考過程。我結束了使用犀牛,因爲它現在是JDK的一部分。祝你好運 – Draemon 2008-10-14 13:58:58

0

可以,只要從你的JDK tools.jar文件在類路徑訪問編譯器。它的文檔是here。在某些解釋型語言中,API不像eval()那麼簡單,但它在那裏。

您可能還需要進入一些奇怪的ClassLoader代碼才能真正運行該代碼,我對此並不完全確定。

12

JDK6有Java compiler API。但是,它不一定非常容易使用。

快速谷歌拉起this example usage

+1

感謝您的鏈接!發現這個例子對我來說非常合適:http://www.javablogging.com/dynamic-in-memory-compilation/ – Peter 2012-08-27 13:34:03

6

我認爲你最好的照片是Janino。這會讓你在運行時編譯代碼,並從程序的其餘部分調用它。我們在一些系統中使用它來讓我們動態地更新一些類。

這不是免費的。它運行良好,但每次載入新類(或類的版本)時都會使用permgen空間,所以如果你有一個(很長)正在運行的進程(或者加載了大量新類的東西),那麼最終會耗盡內存),但您可以更改JVM中的permgen空間量,以便在出現問題時以相當的方式移除該屏障。如果你需要在這個級別操作,你可以看到它是如何注入字節碼的。您可能需要製作一個類加載器,或者像Tom Hawtin建議的那樣使用Java編譯器API。