【发布时间】:2012-06-22 09:17:00
【问题描述】:
我需要以某种方式深度克隆我的 ScriptEngine 对象的整个绑定集。
我尝试过的
到目前为止,我已经尝试使用 Cloner library 克隆整个 Bindings 结构。如果它有效,那就太好了,因为它可以确保精确的副本,包括私有变量。但这会导致 jvm 堆损坏(jvm 只是崩溃,退出代码为 -1073740940)。有时它不会崩溃,但会发生奇怪的事情,比如
System.out.println()停止正常工作......我还研究了使用 ScriptEngine 中的 js 代码克隆对象,以便我可以将它们作为 NativeObjects 获取并在一些 java 映射中管理它们。但是我发现的所有克隆方法都有缺陷。我想要对象的精确快照。例如,如果两个对象 a 和 b 中的每一个都包含引用同一对象 c 的字段(例如 a.fa 和 b.fb),则使用
jQuery.extend()克隆时(例如)字段a.fa和b.fb克隆的 a 和 b 将引用 c 的不同克隆,而不是引用同一个克隆。以及许多其他边缘问题。我还尝试使用 Cloner 克隆整个 ScriptEngine(不仅仅是绑定),我还尝试使用 Rhino 的 js 引擎并克隆整个范围(而不是捆绑的 ScriptEngine 包装器)。但是堆损坏问题仍然存在。
为什么我需要这样做
我需要这个,因为我必须能够将整个 ScriptEngine 绑定的值恢复到以前的某个点。我需要制作绑定的精确快照。
该应用程序是我的博士研究项目的一部分,该项目包括运行带有节点(在 java 中实现)的状态机,这些节点附加了 js 代码。 js 代码由最终用户输入,并在运行时进行评估。当无法通过路径到达最终状态时,算法会向后退一步,试图找到替代路径。在每一步后退时,它都必须撤消 js 引擎绑定中可能发生的任何更改。
所有全局变量名称在 js eval-ing 之前都是已知的,并且是对象(用户为节点键入代码,然后(在 java 中)将其组织成具有特定名称模式的 js 对象)。但它们的内容可以是任何内容,因为这是由用户 js 代码控制的。
所以我想我现在唯一的解决方案是使用 js 代码克隆 js 对象。
【问题讨论】:
标签: javascript java clone rhino scriptengine