2014-10-06 34 views
3

我有定期推送到數據庫的Java代碼(這太複雜了,爲什麼它不在數據庫中解釋,而只是將焦點從主要問題中解放出來) 。執行存儲在數據庫中的Java代碼

在運行期間,我查詢數據庫。我可以執行從數據庫中獲得的代碼嗎?我只在代碼中存儲主要方法的內容。運行數據庫的服務器是HTTP服務器。

實施例的代碼從數據庫(僅供參考):

int i = 10; 
int j = 2; 
int k = i*j; 
System.out.println("Result is " + k); 

預期輸出:

Result is 20 
+0

那麼你的數據庫包括源代碼或/和字節碼? – msrd0 2014-10-06 13:32:45

+0

你可以動態地用db中的代碼構建一個java類然後運行它。 – brso05 2014-10-06 13:37:12

+0

@ msrd0 - 它的源代碼 – user3760419 2014-10-06 13:46:52

回答

4

任何Java程序是正確的Groovy程序。所以,你可以添加Groovy的依賴關係到您的項目,然後用GroovyShell執行代碼:

GroovyShell shell = new GroovyShell(); 
shell.evaluate(code); 

所以你的情況:

GroovyShell shell = new GroovyShell(); 
shell.evaluate("int i = 10;\n" + 
     "int j = 2;\n" + 
     "int k = i*j;\n" + 
     "System.out.println(\"Result is \" + k);"); 

輸出:

結果20

或者你可以使用ScriptEngineManager(更常見的方式):

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("groovy"); 
engine.eval("int i = 10;\n" + 
     "int j = 2;\n" + 
     "int k = i*j;\n" + 
     "System.out.println(\"Result is \" + k);"); 

但無論如何,你需要的Groovy添加到您的depedencies。

0

您可以構建java源代碼,然後使用反射來加載java類。因此,添加一個新的Servlet來你的HTTP服務器,把它getJar,並把在doGet方法如下(假設你已經創建了數據庫連接):

File tmp = File.createTempFile("java-code-", ".java"); 
PrintWriter out = new PrintWriter(new FileWriter(tmp), true); 
String classname = tmp.getName().substring(0, tmp.getName().length()-5); 
out.println("public class " + classname); 
out.println("{"); 
out.println(" public static void executeCode()"); 
out.println(" {"); 
out.println(connection.executeQuery("SELECT java-code FROM yourDb WHERE name='" 
     + request.getParameter("name").replace("'", "''") + "';"); 
out.println(" }"); 
out.println("}"); 
out.close(); 
Runtime.getRuntime().exec("javac \"" + tmp.getAbsolutePath() + "\"").waitFor(); 
Runtime.getRuntime().exec("jar cfe \"" + tmp.getAbsolutePath() + ".jar\" \"" 
     + classname + "\" \"" + tmp.getAbsolutePath() + "\""); 
InputStream in = new InputStream(new FileInputStream(tmp.getAbsolutePath() + ".jar")); 
int read; byte[] buf = new byte[4096]; 
while ((read = in.read(buf)) != null) 
    response.getOutputStream().write(buf, 0, read); 
in.close(); 

現在,你可以接受它,並創建一個ClassLoader爲它,然後執行它:

ClassLoader cl = new URLClassLoader("http://localhost/getJar?name=whatever"); 
Class c = cl.loadClass(classname); 
c.getMethod("executeCode").invoke(null); 
相關問題