2015-12-08 1 views
3

ScriptObjectMirror имеет метод unwrap, который принимает объект Global. Проблема в том, что я не могу понять, как отправить глобальный объект, потому что, похоже, нет простого способа получить к нему доступ. Это означает, что я всегда получаю зеркало и не сырьевая объекта (декомпилированы код из ScriptObjectMirror.class):Передача в глобальном объекте ScriptObjectMirror.unwrap

public static Object unwrap(Object obj, Object homeGlobal) { 
    if(obj instanceof ScriptObjectMirror) { 
     ScriptObjectMirror mirror = (ScriptObjectMirror) obj; 
     return mirror.global == homeGlobal ? mirror.sobj : obj; 
    } else { 
     return obj instanceof JSONListAdapter?((JSONListAdapter)obj).unwrap(homeGlobal):obj; 
    } 
} 

Как пройти в правильном глобальном объекте?

ответ

2

В Nashorn вы не можете развернуть ScriptObjectMirror экземпляров из-за рубежа. То есть, если текущий глобальный («глобальный» объект JavaScript) не совпадает с глобальным объектом развернутого объекта, Nashorn не разворачивает его. Также не существует способа получить доступ к текущему глобальному объекту JavaScript.

Существует ScriptUtils#unwrap, который не принимает глобальный характер, но также показывает то же поведение.

+0

Единственный (уродливый) способ я нашел, как получить этот глобальный, используя частное отражение (не судите меня :)), чтобы получить глобальное значение, которое, по-видимому, находится в каждом ScriptObjectMirror. Я пытаюсь реализовать способность передавать ScriptObjectMirrors в потоке данных, не требуя явно пропустить движок. Кажется сложным без нарушения инкапсуляции. BLEH. –