我在Java中使用Rhino在Android上执行JavaScript。 要执行javascript,我使用Context#compileString()创建一个Script对象 然后在脚本对象上调用exec。
我调用的执行的js由两部分组成:一个是常量,一个是动态的。是否可以只编译一次常量部分以提高性能?我找不到合并两个脚本对象的任何内容,所以看起来这是不可能的。但也许我只是忽略了一些问题,或者还有另一种解决问题的办法?
答案 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