Доступ/перехват глобальных объектных переменных Nashorn

Это в том же ключе, что и вопрос под названием "Захват глобальных переменных Nashorn" . Я считаю, что это очень ограничивает невозможность перехвата назначения переменных глобальному объекту.

Например, скажем, eval script "a = 10". Возможно, я хочу вызвать слушателя, чтобы уведомить что-то, что "a" было добавлено в область. Единственный способ сделать это - исследовать глобальный объект после script eval'd.

Или скажите, что я хочу перехватить объект, назначенный глобальной области, и заменить его на другой; если он использовал Bindings, я мог реализовать put и передать на другие привязки:

public Object put(String name, Object value) {
    //put a toStringed version of the object in scope
    return delegate.put(name, value+"");
}

Таким образом, когда выдается код "a = 10", он будет помещать "10" в область видимости вместо 10.

Удобно иметь интерфейс Bindings для реализации, но разочаровывает то, что я не могу предоставить что-то подобное этой реализации для глобального объекта. ScriptObjectMirror является окончательным, поэтому я не могу даже перегрузить его и захватить последующий вызов внутреннего ScriptObject. Я что-то пропустил?

Ответ 1

Таким образом, в основном вы хотите перехватить/заблокировать присвоения произвольным свойствам на каком-либо объекте. В вашем случае глобальный объект.

Afaik, это никогда не было возможно без какого-либо довольно хакерского кода. Поиск "наблюдаемых javascript" может помочь вам в этом, но будьте осторожны, вы попадете в какую-то грязную территорию.

Если это предназначено для тестирования (в отличие от производственного кода), setTimeout/setInterval с некоторым прослушивателем, который периодически перечисляет все свойства глобального объекта и регистрирует предупреждение, если он был добавлен, может быть достаточно хорошим для вы.

В будущем у нас будет Javascript Proxy, чтобы помочь нам в этом, но я серьезно сомневаюсь, что он еще есть в Нашорне, Прошло некоторое время с тех пор, как я работал с Нашорном, но после первоначального всплеска на сцене было тихо на фронте ашона Нашорна...