2014-10-06 2 views
3

정기적으로 데이터베이스에 푸시되는 Java 코드가 있습니다 (데이터베이스에있는 이유를 설명하기에는 너무 복잡하여 주요 질문에서 초점을 돌 렸을뿐입니다) .데이터베이스에 저장된 Java 코드를 실행하십시오.

런타임 중에 데이터베이스에 쿼리합니다. 데이터베이스에서 가져온 코드를 실행할 수 있습니까? 나는 코드에 main 메소드의 내용만을 저장하고있다. 데이터베이스가 실행되는 서버는 HTTP 서버입니다. 데이터베이스에서 (단지 참조)

예제 코드 :

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

예상 출력 :

Result is 20 
+0

데이터베이스에 소스 코드 또는 바이트 코드가 포함되어 있습니까? – msrd0

+0

db의 코드로 동적으로 Java 클래스를 빌드 한 다음 실행할 수 있습니다. – brso05

+0

@ msrd0 - 소스 코드 – user3760419

답변

4

모든 자바 프로그램은 올바른 그루비 프로그램입니다.

결과는 20 : 귀하의 경우 그래서

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);"); 

그리고 출력 그래서 당신은 GroovyShell이 코드를 실행하여 다음 프로젝트에 그루비 종속성을 추가 할 수 있습니다

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);"); 

을 어쨌든, 당신은 당신의 depedencies에 그루비 추가해야합니다 ScriptEngineManager는 (일반적인 방법)를 사용할 수 있습니다.

0

Java 소스 코드를 빌드 한 다음 리플렉션을 사용하여 Java 클래스를로드 할 수 있습니다. 따라서, (이미 DB 연결을 만든 가정) getJar를 호출하여 HTTP 서버에 새로운 서블릿을 추가하여 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); 
관련 문제