[英]java in-memory compilation
如何在運行時從String生成字節碼(Byte []),而不使用“javac”進程或類似的東西? 是否有一種簡單的方式來調用編譯器?
后來補充:
我選擇接受最符合我情況的解決方案 。 我的應用程序是一個仍處於設計草圖階段的業余愛好項目,現在是考慮插入新技術的最佳時機。 另外,因為那個應該幫助我的人是一個JavaScript開發人員,在這種情況下,使用JavaScript解釋器而不是存根編譯器+ classLoader的想法似乎更吸引我。 這個問題的其他(未被接受的)答案是提供信息的,據我所知,非常好地回答我的問題,所以謝謝,但我要去嘗試Rhino :)
JDK6有一個Java編譯器API 。 但是,它不一定非常容易使用。
一個快速谷歌拉起這個示例用法 。
我認為你最好的投籃將是Janino 。 這將允許您在運行時編譯代碼並從程序的其余部分調用它。 我們在一些系統中使用它來讓我們動態更新某些類。
這不是免費的。 它運行良好,但每次加載一個新類(或類的版本)時它都使用permgen空間,因此如果你有一個(真的)長時間運行的進程(或者加載了很多新類的東西),你最終會耗盡內存但是你可以改變JVM中的permgen空間量,以便在遇到問題時將障礙移開。
Janino實際上是一個編譯器,但如果你需要在那個級別運行,你可以看到它如何注入字節碼。 您可能需要最終制作類加載器或使用Tom Hawtin建議的Java編譯器API。
你可能會發現像rhino或groovy這樣的東西在實踐中更有用。
只要JDK中的tools.jar文件位於類路徑中,就可以訪問編譯器。 它的文檔在這里 。 在某些解釋語言中,API並不像eval()
那么簡單,但它就在那里。
您可能還需要進入一些奇怪的ClassLoader代碼來實際運行該代碼,我對此並不完全確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.