[英]Execute Java code that is stored in the database
我有定期推送到數據庫的Java代碼(解釋為什么它在數據庫中太復雜了,這只會把焦點從主要問題轉移開來)。
在運行時我查詢數據庫。 我可以執行從數據庫中獲取的代碼嗎? 我只在代碼中存儲main方法的內容。 運行數據庫的服務器是HTTP服務器。
來自數據庫的示例代碼(僅供參考):
int i = 10;
int j = 2;
int k = i*j;
System.out.println("Result is " + k);
預期產量:
Result is 20
任何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添加到您的依賴項中。
您可以構建java源代碼,然后使用反射加載java類。 因此,將新的Servlet添加到HTTP Server,將其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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.