2013-07-12 2 views
11

디버그 이유로 인해 콘솔을 통해 입력 한 코드를 실행할 수 있어야합니다. 예 :Java 문자열의 코드 실행

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
while(true){ 
    String str = br.readLine(); //This can return 'a = 5;','b = "Text";' or 'pckg.example.MyClass.run(5);' 
    if(str == null) 
     return; 
    runCode(str); //How would I do this? 
} 
+7

진짜 질문은 : ** 왜 **이 작업을 수행하고 싶습니다 ... – Dariusz

+1

우리가 분할에 대한 가정 해 봅시다 초이 가능합니다 ...하지만 Java가 런타임 코드를 어떻게 컴파일합니까? – AurA

+2

필요한 것은 어쩌면 [Java interpreter] (http://stackoverflow.com/questions/3504396/java-interpreter)입니다. – LaurentG

답변

3

당신은 자바 스크립트 엔진을 실행할 수 있습니다

Object res = new ScriptEngineManager().getEngineByName("js").eval(str); 

자바 스크립트 엔진은 1.6부터 자바 SE의 일부입니다. 자세한 내용은 http://download.java.net/jdk8/docs/technotes/guides/scripting/programmer_guide/index.html을 참조하십시오.

+0

은 BeanShell이다, 자바 집합 같은 다른 스크립트 언어가 있습니다. –

+0

스크립트가 옵션이라면 왜 멀리 떨어진 자바인가? 스칼라, 그루비, JRuby가 있습니다. JRuby의 성능을 모두 좋아할 것 같습니다. 당신이 java8에있는 경우 – Bnrdo

+0

내가 사용하는 것 nudge4j https://lorenzoongithub.github.io/nudge4j/ – Zo72

0

이 경우 Java Compiler API을 볼 수 있습니다. 필자는 어떻게 작동하는지에 대해서는별로 연구하지 않았지만 자바 파일을로드하고 이미 실행중인 시스템에서 클래스를 컴파일하고로드 할 수 있습니다. 어쩌면 콘솔에서 입력을 받아 들일 수 있습니다.

+0

, 파일을 만들기 위해 클래스와 코드를 작성하는 것을 의미한다이 방법 그것은, 그것을 여는 코드를 실행, 그것을 컴파일 ... 코드 줄을 실행하는 가장 좋은 방법은 보이지 않습니다 ... – user2555349

3

javax.script 패키지에있는 Java 스크립팅 API를 사용할 수 있습니다. 예를 들어 bsh과 같은 여러 스크립트 언어를 포함 할 수 있습니다.

programmer's guide은 오라클 웹 페이지에서 찾을 수 있습니다.

일부 JavaScript 인 Rhino는 이미 Oracle JVM에 포함되어 있습니다. 코드가 자바 스크립트에있는 경우

0

일반 컴파일러의 경우 Java 코드를 컴파일하고 실행할 수있는 Janino을 사용할 수 있습니다. expression evaluator을 사용하면 도움이 될 수 있습니다.

디버깅 중에 표현식을 평가하려는 경우 Eclispe는 표현식을 실행할 수있는 Display view을 가지고 있습니다. this question을 참조하십시오.

4

에 실제로 사용 this을 읽은 후, 나는 가정하에 있었다 본

당신이 자바 코드, 자바 스크립트 같은하지 일부 스크립트 엔진으로 문자열을 알아보고자 나는 충동이 만든 그래서 를 사용하지 마십시오 컴파일러 API 마크 언급했다. 아마 아주 나쁜 습관이지만, (다소) 그것이 원했던 것처럼 작동합니다. 새로운 클래스의 컨텍스트에서 코드를 실행하기 때문에 디버깅에 많은 도움이 될 것입니다. 샘플 사용량은 하단에 포함되어 있습니다. 와

import javax.tools.JavaCompiler; 
import javax.tools.StandardJavaFileManager; 
import javax.tools.ToolProvider; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.Arrays; 

public class main { 
    public static void runCode(String s) throws Exception{ 
     JavaCompiler jc = ToolProvider.getSystemJavaCompiler(); 
     StandardJavaFileManager sjfm = jc.getStandardFileManager(null, null, null); 
     File jf = new File("test.java"); //create file in current working directory 
     PrintWriter pw = new PrintWriter(jf); 
     pw.println("public class test {public static void main(){"+s+"}}"); 
     pw.close(); 
     Iterable fO = sjfm.getJavaFileObjects(jf); 
     if(!jc.getTask(null,sjfm,null,null,null,fO).call()) { //compile the code 
      throw new Exception("compilation failed"); 
     } 
     URL[] urls = new URL[]{new File("").toURI().toURL()}; //use current working directory 
     URLClassLoader ucl = new URLClassLoader(urls); 
     Object o= ucl.loadClass("test").newInstance(); 
     o.getClass().getMethod("main").invoke(o); 

    } 
    public static void main(String[] args) { 
     BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
     while(true){ 
      try { 
      String str = br.readLine(); //This can return 'a = 5;','b = "Text";' or 'pckg.example.MyClass.run(5);' 
      if(str == null) 
       return; 

      runCode(str); //How would I do this? 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 

    } 
} 
//command line 
> System.out.println("hello"); 
hello 
> System.out.println(3+2+3+4+5+2); 
19 
> for(int i = 0; i < 10; i++) {System.out.println(i);} 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

SimpleJavaFileObjecthere를 같이 사용하면 실제로 파일을 사용하지 수 있지만 구문이 그래서 난 그냥 현재 작업 디렉토리에있는 파일을 선택했다 조금 성가신 것 같다.

편집 : Convert String to Code 비슷한 접근 방식을 제공하지만 완전히 구체화 아니에요