簡體   English   中英

執行存儲在數據庫中的Java代碼

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

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