访问/拦截Nashorn的全局对象变量

时间:2016-03-16 21:02:12

标签: javascript java nashorn

这与标题为"Capturing Nashorn's Global Variables"的问题大致相同。我发现它非常有限,无法拦截变量到全局对象的分配。

例如,说我评估脚本" a = 10"。也许我想打电话给听众通知一些事情' a'被添加到范围中。我能做到这一点的唯一方法是在脚本eval之后调查全局对象。

或者说我想拦截分配给全局范围的对象并将其替换为另一个对象;如果它正在使用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 个答案:

答案 0 :(得分:0)

所以基本上你想要做的是截取/陷阱某些对象的任意属性。在您的情况下,全局对象。

Afaik,如果没有一些漂亮的hacky代码,这实际上是不可能的。搜索'observables javascript'可能会对此有所帮助,但请注意,您将进入一些泥泞的领域。

如果这是用于测试(而不是生产代码),带有一些侦听器的setTimeout / setInterval会定期枚举全局对象的所有属性,并在添加一个警告时记录警告对你来说足够好。

将来,我们会有Javascript Proxy标准来帮助我们,但我非常怀疑它在Nashorn还有。自从我和Nashorn一起工作已经有一段时间了,但是在现场的最初爆发之后,它已经在Nashorn的前方安静了......