Rhino将两个编译的Scripts合并为一个

时间:2014-05-28 14:22:34

标签: java android rhino

我在Java中使用Rhino在Android上执行JavaScript。 要执行javascript,我使用Context#compileString()创建一个Script对象 然后在脚本对象上调用exec。

我调用的执行的js由两部分组成:一个是常量,一个是动态的。是否可以只编译一次常量部分以提高性能?我找不到合并两个脚本对象的任何内容,所以看起来这是不可能的。但也许我只是忽略了一些问题,或者还有另一种解决问题的办法?

1 个答案:

答案 0 :(得分:1)

我相信您想要使用ScriptContext,然后再次从ScriptEngine然后eval()获取它。请注意,您可以重复使用它(只要您不修改静态部分),请参阅下面的compiled

public static void main(String[] args) {
  ScriptEngineManager manager = new ScriptEngineManager();
  ScriptEngine rhino = manager.getEngineByName("JavaScript");
  try {
    rhino.eval("function f(){return 1+1;} "
        + "function g(){return f()*f();}");
    ScriptContext compiled = rhino.getContext();
    String f = rhino.eval("f()", compiled).toString();
    String g = rhino.eval("g()", compiled).toString();
    System.out.println("f() = " + f);
    System.out.println("g() = " + g);
  } catch (ScriptException e) {
    e.printStackTrace();
  }
}

输出

f() = 2.0
g() = 4.0

修改

注意,我也可以做到 -

rhino.eval("var i = 0; function f(){return ++i;} "
      + "function g(){return f()*f();}");
ScriptContext compiled = rhino.getContext();
String f = rhino.eval("f()", compiled).toString();
System.out.println("f() = " + f);
f = rhino.eval("f()", compiled).toString();
String g = rhino.eval("g()", compiled).toString();
System.out.println("f() = " + f);
System.out.println("g() = " + g);

哪些输出(可能是意外的)12,

f() = 1.0
f() = 2.0
g() = 12.0