像Rhino一样,对多个作用域编译一次
Nashorn, compile once for multiple scopes, like for Rhino
我正在研究将一个基于rhino的大型项目转移到nashorn的可能性。这个项目有数千个作用域(~个实例)运行在一个rhino编译的脚本中(10k+行javascript)。
我知道怎么做:
- 多个nashorn引擎将给我多个/独立的范围。工作,但消耗了太多的内存(1000个引擎…)
- eval一个编译脚本的字符串。也可以工作,但几乎不可能传递复杂的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原语(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-loadWithNewGlobal)。这个原语允许你在新的全局作用域中加载脚本——每个都有自己的"对象"、"函数"等定义。这似乎对您的用例有所帮助。还有作用域间对象方法/属性访问支持。也就是说,你可以在不同作用域的脚本中传递和返回对象——适当的包装/镜像由Nashorn负责。
相关文章:
- Javascript返回值只在循环中返回一次
- Jquery FadeIn FadeOut 只工作一次
- Javascript html每点击一次就会更改url
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- jQuery滚动功能只工作一次
- 刷新导致我的帖子“;张贴“;再一次
- 引导程序崩溃一次只能看到一个
- 有没有一个抽象层,这样我就可以集成一次,然后使用pusher、pubnub或faye
- 加载器组件仅加载一次
- 根据Angular.JS上一次的内容禁用选择
- 一次又一次地在新的和相同的选项卡中打开一个url
- 只在宽度以下和宽度以上各准备一次
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- Angularjs:空对象,当只有一次点击时
- 在Angular应用程序中每个帖子投票一次
- 为什么我的代码可以在chrome上工作,而不是一次使用cordova编译
- 翡翠模板只需要编译一次
- 像Rhino一样,对多个作用域编译一次
- 当model '编译后不能覆盖' User '模型;& # 39;编译一次(或者我已经监督了一些东西)