今天在看到《Java瘋狂講義》中一個章節習題:
開發一個工具類,該工具類提供一個eval()方法,實現JavaScript中eval()函數的功能——可以動態運行一行或多行程序代碼。例如:eval("System.out.println("hello world")"),將輸出hello world。
code:
import java.io.*;
/**
* Java創建一個類似於js中eval()的方法
*/
public class EvalUtil {
public static void main(String[] args) throws Exception {
eval("int a = c; int b = 2; System.out.println(a+b);");
}
public static void eval(String javaStr) throws Exception {
StringBuffer str = new StringBuffer();
str.append("public class Eval {").append("public static void main(String[] args) {").append(javaStr).append("}}");
OutputStream out = new FileOutputStream("Eval.java");
out.write(str.toString().getBytes("gbk"));
out.close();
// 編譯時 錯誤信息
Process javacProcess = Runtime.getRuntime().exec("javac Eval.java");
InputStream compileError = javacProcess.getErrorStream();
System.err.println(read(compileError));
compileError.close();
Process javaProcess = Runtime.getRuntime().exec("java Eval");
//運行時 錯誤信息
InputStream err = javaProcess.getErrorStream();
System.err.println(read(err));
err.close();
//運行時 正常信息
InputStream success = javaProcess.getInputStream();
System.out.println(read(success));
success.close();
//刪除生成文件
new File("Eval.java").delete();
new File("Eval.class").delete();
}
private static String read(InputStream in) throws IOException {
byte[] b = new byte[1024];
int len = -1;
StringBuffer str = new StringBuffer();
while ((len = in.read(b)) != -1) {
str.append(new String(b, 0, len, "gbk"));
}
return str.toString();
}
}
