代码在最底部,请自行提取!
代码说明:
1.允许直接使用,如下:
public class EvalTest {
public static void main(String[] args) {
String code =
"int a = 1;" +
"int b = 2;" +
"System.out.println(a+b);";
Eval eval = new Eval(code);
eval.compiler();
eval.run();
}
}
结果如下:
3为a+b之后的结果
2.允许包含主类,如下:
public class EvalTest { public static void main(String[] args) {
final StringBuilder code = new StringBuilder();
code.append("public class Hello {");
code.append("public static void main(String [] args){");
code.append("System.out.println(\"Hello World!\");");
code.append(" }");
code.append("}");
Eval eval = new Eval(code.toString());
eval.compiler();
eval.run();
}
}
结果:
请注意,主类必须位于所有其他类的前面!!!
3.允许指定某目录下的Java文件直接运行,如下:
public class EvalTest { public static void main(String[] args) {
Eval eval = new Eval("D:/Java/IDEAProject/ReviewJavaBasics/target/classes/","Test181.java");
eval.compiler();
eval.run();
}
}
Test181.java内容如下:
import java.io.*;import java.nio.charset.Charset;
import java.util.Scanner;
public class Test181 {
public static void main(String[] args) {
new Test181().test1();
}
private void test1() {
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec("ping www.baidu.com");
process.waitFor();
try (Scanner scanner = new Scanner(process.getInputStream(), Charset.forName("GBK"));) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
结果:
注意:
在EvalTest中的 Eval eval = new Eval(路径,文件名);
文件名允许指定非java文件,作为输入源,测试如下:
public class EvalTest { public static void main(String[] args) {
Eval eval = new Eval("D:/Java/IDEAProject/ReviewJavaBasics/target/classes/","zhw.txt");
eval.compiler();
eval.run();
}
}
zhw.txt
工作目录:
运行结果:
请注意,该Eval类有一个bug,就是不能运行,设置了包名的代码!!!
public class Eval {
// 文件名
private String classname;
private boolean isCompiler = false;
// 扩展名
private final static String fx = ".java";
// 编码格式,由于是在windows下,故dos窗口为gbk格式
private final Charset charset = Charset.forName("GBK");
// 将要被执行的代码
private final StringBuilder code = new StringBuilder();
// 设置java文件所在的目录
private String PATH = "D:/Java/Test";
Eval(String code) {
init(code);
}
Eval(String path, String name) {
PATH = path;
int doc = name.lastIndexOf(".");
if (name.substring(doc).equals(".java")) {
this.classname = name.substring(0, doc);
} else {
init(getCode(name));
}
}
private void init(String code) {
if (code.contains("public class ")) {
this.code.append(code);
initClassname();
} else {
initCode();
this.code.append(code);
endCode();
}
writeFile();
}
public void compiler() {
try {
Process exec = Runtime.getRuntime().exec("javac " + classname + fx, null, new File(PATH));
StringBuilder compilerInfo = new StringBuilder();
try (BufferedReader bf = new BufferedReader(
new InputStreamReader(exec.getErrorStream(), charset))) {
String line;
while ((line = bf.readLine()) != null) {
compilerInfo.append(line);
compilerInfo.append("\n");
}
if (compilerInfo.length() == 0) {
isCompiler = true;
System.out.println(classname + fx + " 编译成功!");
} else {
System.out.println("编译失败");
System.out.println(compilerInfo.toString());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
if (!isCompiler) {
System.out.println("编译失败,无法运行!");
System.exit(0);
}
try {
Process exec = Runtime.getRuntime().exec("java " + classname, null, new File(PATH));
StringBuilder runInfo = new StringBuilder();
try (BufferedReader bf = new BufferedReader(
new InputStreamReader(exec.getInputStream(), charset))) {
String line;
while ((line = bf.readLine()) != null) {
runInfo.append(line);
runInfo.append("\n");
}
System.out.println(classname + " 运行成功!");
System.out.println(runInfo.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String getCode(String name) {
StringBuilder sb = new StringBuilder();
try (BufferedReader bf =
new BufferedReader(
new InputStreamReader(new FileInputStream(PATH + name)));) {
String line;
while ((line = bf.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
private void writeFile() {
try (PrintStream ps = new PrintStream(PATH + classname + fx, charset);) {
ps.println(code.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
private void initClassname() {
String s = "public class ";
int classnameStart = code.indexOf(s) + s.length();
int classnameEnd = code.indexOf(" ", classnameStart);
classname = code.substring(classnameStart, classnameEnd);
}
private void initCode() {
code.append("public class Test {");
code.append(" public static void main(String [] args){");
classname = "Test";
}
private void endCode() {
code.append("}");
code.append("}");
}
}