Клонировать весь JavaScript ScriptEngine

Мне нужно каким-то образом глубоко клонировать весь набор привязок моего объекта ScriptEngine.

Что я пробовал

  • До сих пор я пробовал библиотеку Clonerдля клонирования всей структуры Bindings. Было бы здорово, если бы это работало, потому что это обеспечило бы точную копию, включая частные переменные. Но это приводит к повреждению кучи jvm (jvm просто падает с кодом выхода -1073740940). Иногда он не падает, но происходят странные вещи, например, System.out.println()перестает работать как надо...

  • Я также изучал возможность клонирования объектов с помощью кода js внутри ScriptEngine, чтобы я мог получить их как NativeObjects и управлять ими на некоторых картах Java.Но все методы клонирования, которые я нашел, имеют недостатки. Мне нужен точный снимок объектов. Например, если каждый из двух объектов a и b содержит поля (скажем, a.fa и b.fb), которые ссылаются на один и тот же объект c, при клонировании с использованием jQuery.extend()(например) поля a.faи b.fbклонированных a и b будут ссылаться на разные клоны c, а не на один и тот же клон. И многие другие пограничные вопросы.

  • Я также пытался клонировать весь ScriptEngine с помощью Cloner (не только привязки), а также пытался использовать js-движок Rhino и клонировать всю область действия (вместо встроенной оболочки ScriptEngine). Но проблема с повреждением кучи сохраняется.

Зачем мне это нужно

Мне это нужно, потому что я должен иметь возможность восстанавливать значения всех привязок ScriptEngine к некоторой предыдущей точке. Мне нужно сделать точные снимки креплений.

Приложение является частью моего докторского исследовательского проекта, который состоит из запуска конечных автоматов с узлами (реализованными на Java), к которым прикреплен код js. Код js вводится конечным пользователем и проверяется во время выполнения. Когда конечное состояние не может быть достигнуто через путь, алгоритм делает шаги назад, пытаясь найти альтернативные пути. На каждом шагу назад он должен отменять любые изменения, которые могли произойти в привязках движка js.


Все имена глобальных переменных известны до оценки js и являются объектами (пользователь вводит код для узлов, который затем организуется (внутри java) в объекты js с определенными шаблонами имен).Но их содержимое может быть любым, потому что оно контролируется пользовательским js-кодом.

Итак, я думаю, что мое единственное решение сейчас — клонировать js-объект с помощью js-кода.

6
задан JasonMArcher 8 July 2015 в 02:17
поделиться