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