这与标题为"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
的后续调用。我错过了什么吗?
答案 0 :(得分:0)
所以基本上你想要做的是截取/陷阱某些对象的任意属性。在您的情况下,全局对象。
Afaik,如果没有一些漂亮的hacky代码,这实际上是不可能的。搜索'observables javascript'可能会对此有所帮助,但请注意,您将进入一些泥泞的领域。
如果这是用于测试(而不是生产代码),带有一些侦听器的setTimeout
/ setInterval
会定期枚举全局对象的所有属性,并在添加一个警告时记录警告对你来说足够好。
将来,我们会有Javascript Proxy标准来帮助我们,但我非常怀疑它在Nashorn还有。自从我和Nashorn一起工作已经有一段时间了,但是在现场的最初爆发之后,它已经在Nashorn的前方安静了......