Javascript Nashorn,为多个作用域编译一次,比如Rhino

Javascript Nashorn,为多个作用域编译一次,比如Rhino,javascript,java,rhino,nashorn,Javascript,Java,Rhino,Nashorn,我正在调查是否有可能将一个基于rhino的大型项目转移到nashorn。也就是说,该项目有数千个作用域(~实例),运行在一个rhino编译的脚本中(包含10k+行javascript) 我知道怎么做: 多个nashorn引擎将为我提供多个/独立范围。工作正常,但会消耗太多内存(1000个引擎…) 评估nashorn编译脚本上的字符串。它也可以工作,但几乎不可能将复杂的java对象/实例传递给我想要调用的函数 我可以用Rhino做些什么,并希望用Nashorn做些什么: String SOUR

我正在调查是否有可能将一个基于rhino的大型项目转移到nashorn。也就是说,该项目有数千个作用域(~实例),运行在一个rhino编译的脚本中(包含10k+行javascript)

我知道怎么做:

  • 多个nashorn引擎将为我提供多个/独立范围。工作正常,但会消耗太多内存(1000个引擎…)
  • 评估nashorn编译脚本上的字符串。它也可以工作,但几乎不可能将复杂的java对象/实例传递给我想要调用的函数
我可以用Rhino做些什么,并希望用Nashorn做些什么:

String SOURCE = "var i = 0; function add(a) { i += a; return i; }";
System.out.println("=== RHINO ===");
Context cx = Context.enter();
cx.setOptimizationLevel(Context.FEATURE_STRICT_EVAL); // optimization level 9

Script script = cx.compileString(SOURCE, "mySource", 1, null); // compile once

Scriptable scope1 = cx.initStandardObjects(); // 1st re-use
Scriptable scope2 = cx.initStandardObjects(); // 2nd re-use

script.exec(cx, scope1);
script.exec(cx, scope2);

Function add1 = (Function) scope1.get("add", scope1);
Function add2 = (Function) scope2.get("add", scope2);

try {
    Object r1 = add1.call(cx, scope1, scope1, new Object[]{6});
    System.out.println("result1=" + r1); // print 6
    r1 = add1.call(cx, scope1, scope1, new Object[]{4});
    System.out.println("result1=" + r1); // print 10
} catch (Exception ex) {
    ex.printStackTrace();
}

try {
    Object r2 = add2.call(cx, scope2, scope2, new Object[]{9});
    System.out.println("result2=" + r2); // prints 9
    r2 = add2.call(cx, scope2, scope2, new Object[]{3});
    System.out.println("result2=" + r2); // prints 12
} catch (Exception ex) {
    ex.printStackTrace();
}

Context.exit();
在上面的示例中,我编译了一次脚本,并使用多个作用域来隔离不同的执行实例。 我怎么能对纳肖恩做这样的事?请记住,在我的实际项目中,我希望调用更复杂的函数,这些函数将在参数中包含javascript或java实例


提前感谢您的帮助。

Nashorn支持loadWithNewGlobal primitive()。此原语允许您在新的全局范围内加载脚本-每个脚本都有自己的“对象”、“函数”等定义。这似乎对您的用例有所帮助。还提供范围间对象方法/属性访问支持。i、 例如,您可以向/从在不同范围内评估的脚本传递和返回对象-适当的包装/镜像由Nashorn负责