3 回答

TA貢獻1856條經(jīng)驗 獲得超5個贊
對于真正的Java代碼,可以使用該JavaCompiler接口。但是,使用起來非常不便,因為它只是一個真正的Java編譯器的接口,該編譯器希望編譯文件中找到的整個類定義。
執(zhí)行運行時提供的代碼的最簡單方法是使用Rhino JavaScript引擎。
這兩個選項僅在Java 6中才有,盡管我相信腳本接口以前已經(jīng)存在,所以如果下載并添加到類路徑中,則可以在較早的JRE中使用Rhino。

TA貢獻1843條經(jīng)驗 獲得超7個贊
Javassist
為了運行在運行時提供的任意字符串,您將需要使用字節(jié)碼操作庫(例如Javassist(Wikipedia))。Javassist允許您CtClass
基于表示源代碼的字符串創(chuàng)建一個;然后可以Class
通過特定的類加載器將其轉(zhuǎn)換為已編譯的對象,以便該類可用于您的應用程序。其他庫需要完成與這兩個步驟相似的操作才能實現(xiàn)相同的目的。
因此有可能,但是它非常重,很可能使您的應用程序難以推理。如果有可能,請考慮靜態(tài)設(shè)計一個非常靈活的類,并讓它接受控制其行為的參數(shù)。

TA貢獻1848條經(jīng)驗 獲得超10個贊
如果您想做的不僅僅是動態(tài)調(diào)用現(xiàn)有方法,則可能需要將String編譯為字節(jié)碼。一種簡單的方法是在類路徑中包含Eclipse / JDT編譯器jar,然后可以使用它將String編譯為Class,然后可以將其加載。
這種類型的動態(tài)代碼生成和執(zhí)行用于將JSP文件轉(zhuǎn)換為Servlet,并在其他程序包(如JasperReports)中使用,以將報告規(guī)范轉(zhuǎn)換為可被調(diào)用的類。
請記住,與任何SQL一樣,如果任何String包含用戶指定的數(shù)據(jù),則必須小心防止代碼注入安全性問題。
添加回答
舉報