代码在最底部,请自行提取!

 代码说明:

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();
    }
}

 结果如下:

java reverse函数 javaeval函数_java

   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();
    }
}

结果:

java reverse函数 javaeval函数_System_02

请注意,主类必须位于所有其他类的前面!!!

 

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();
        }
    }
}

结果:

java reverse函数 javaeval函数_java eval_03

注意:

在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

java reverse函数 javaeval函数_java eval_04

工作目录:

java reverse函数 javaeval函数_eval_05

运行结果:

java reverse函数 javaeval函数_Java_06

请注意,该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("}");
    }
}