2014-10-06 35 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); 
相关问题