在beanshell中评估一串代码并获取beanshell解释器返回的值

时间:2014-03-05 05:50:34

标签: java beanshell

我正在使用beanshell bsh-2.0b4.jar文件。我有构建路径并在java程序中使用它。我已设法从控制台获取打印语句。但是如果返回一个值,那么如何获得返回值。

    import java.io.*;
import bsh.Interpreter;
import bsh.EvalError;
public class CaptureDis {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Interpreter i = new Interpreter();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PrintStream ps2 = System.out;

        try {
            //i.eval(System.out.println("System.out.println(\"test\");"));
            i.eval("int x=2; int y=3; int res=x+y; return res");
            i.getOut();
        } catch (EvalError e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        String out = baos.toString();
        System.setOut(ps2);
        System.out.println(out);
    }

}

2 个答案:

答案 0 :(得分:1)

我没有测试你的脚本,但我怀疑你错过了HashSet的import语句。实际上,您不需要脚本中的HashSet声明。由于您在调用之前设置了'hs',因此解释器已知。您的脚本应如下所示:

   srcCode = "for(i=0;i<10;i+=2){ hs.add(i); }";

请注意,在提到您的第一个问题时,如果您在调用之前设置'hs',则需要显式返回它,因为最后一个计算表达式(hs.add(i))返回一个布尔值。但是,由于您传递的是对“hs”的引用,因此根本不需要返回它。

答案 1 :(得分:0)

eval方法返回'res'。实际上,您也可以省略脚本中的return语句,因为beanshell默认返回上次计算的表达式

  Integer answer =  (Integer) i.eval("int x=2; int y=3; int res=x+y; return res");