에 실제로 사용 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 비슷한 접근 방식을 제공하지만 완전히 구체화 아니에요
진짜 질문은 : ** 왜 **이 작업을 수행하고 싶습니다 ... – Dariusz
우리가 분할에 대한 가정 해 봅시다 초이 가능합니다 ...하지만 Java가 런타임 코드를 어떻게 컴파일합니까? – AurA
필요한 것은 어쩌면 [Java interpreter] (http://stackoverflow.com/questions/3504396/java-interpreter)입니다. – LaurentG