簡體   English   中英

java內存中編譯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM