Доступ/перехват глобальных объектных переменных 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, чтобы помочь нам в этом, но я серьезно сомневаюсь, что он еще есть в Нашорне, Прошло некоторое время с тех пор, как я работал с Нашорном, но после первоначального всплеска на сцене было тихо на фронте ашона Нашорна...