简易的Java版 eval()函数

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

 代码说明:

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

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java可以通过Rserve这个R语言的远程调用服务来调用R语言的函数。在Java中,我们需要使用Rserve连接到R语言的服务器,然后使用RConnection类创建一个与R语言的连接,最后使用RConnection类的assign()方法来调用R语言的赋值函数。 具体的操作步骤如下: 1. 在R语言中,使用Rserve库启动R语言服务器,可以使用以下命令启动: ```R library(Rserve) Rserve() ``` 2. 在Java中,使用Rserve连接到R语言的服务器,可以使用以下代码: ```java import org.rosuda.REngine.Rserve.RConnection; RConnection connection = new RConnection("localhost", 6311); // 连接到Rserve服务器 ``` 3. 调用R语言的赋值函数,例如: ```java connection.assign("x", new double[]{1.0, 2.0, 3.0}); // 将向量[1.0, 2.0, 3.0]赋值给变量x ``` 在这个例子中,我们使用RConnection类的assign()方法将一个Java数组赋值给了R语言中的变量x,这相当于在R语言中执行了以下命令: ```R x <- c(1.0, 2.0, 3.0) ``` 如果您想要调用其他的R语言函数,也可以使用RConnection类的eval()方法来执行R代码。例如,如果您想要调用一个名为myfunction的R函数,可以使用以下代码: ```java connection.eval("myfunction(x)"); // 调用名为myfunction的R函数,并传入变量x作为参数 ``` 其中,"myfunction(x)"是一个字符串,表示要在R语言中执行的代码。如果myfunction函数返回了一个结果,可以使用RConnection类的get()方法来获取这个结果。例如: ```java double[] result = connection.eval("myfunction(x)").asDoubles(); // 获取myfunction函数的返回结果,并将其转换为Java的double数组 ``` 以上就是Java调用R语言赋值函数的基本方法。需要注意的是,在使用Rserve时需要确保R语言和Rserve都已经正确安装,并且已经启动了Rserve服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值