将全局对象传递给ScriptObjectMirror.unwrap函数

4

ScriptObjectMirror 有一个 unwrap 方法,可以接受一个 Global 对象。问题是我不知道如何发送全局对象,因为似乎没有一种容易访问它的方式。这意味着我总是得到镜像而不是原始对象(从 ScriptObjectMirror.class 的反编译代码中看到):

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;
    }
}

如何传递正确的全局对象?

1个回答

2
在Nashorn中,您无法从外部上下文解除ScriptObjectMirror实例的包装。也就是说,如果当前全局范围(JavaScript“global”对象)与要取消包装的对象的全局范围不同,Nashorn将无法取消包装它。似乎也没有一种方法可以访问JavaScript对象的当前全局范围。
有一个{{link1:ScriptUtils#unwrap}},它不需要全局参数,但它也显示相同的行为。

2
我发现获取全局变量的唯一(丑陋)方法是使用私有反射(请勿评判我 :))来获取似乎在每个ScriptObjectMirror上的全局变量。我正在尝试实现在数据流中传递ScriptObjectMirrors的能力,而无需显式传递引擎。似乎很难避免破坏封装性。嗯。 - Luke Machowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接