访问/拦截 Nashorn 的全局对象变量
Posted
技术标签:
【中文标题】访问/拦截 Nashorn 的全局对象变量【英文标题】:Accessing/Intercepting Nashorn's Global Object Variables 【发布时间】:2016-07-02 23:48:53 【问题描述】:这与标题为"Capturing Nashorn's Global Variables" 的问题相同。我发现它非常有限,无法拦截将变量分配给全局对象。
例如,假设我评估脚本“a = 10”。也许我想调用一个侦听器来通知将“a”添加到范围中的内容。我能做到这一点的唯一方法是在脚本被评估后调查全局对象。
或者说我想拦截一个分配给全局范围的对象并将其替换为另一个;如果它使用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,如果没有一些非常 hacky 的代码,这真的不可能。搜索“observables javascript”可能会对您有所帮助,但请注意,您会进入一些泥泞的领域。
如果这是为了测试(而不是生产代码),带有一些侦听器的setTimeout
/ setInterval
定期枚举全局对象的所有属性并在添加时记录警告可能足以你。
在未来,我们将拥有Javascript Proxy 标准来帮助我们解决这个问题,但我严重怀疑 Nashorn 是否还存在。自从我与 Nashorn 合作以来已经有一段时间了,但在最初的爆发之后,Nashorn 前线的工作一直很安静......
【讨论】:
以上是关于访问/拦截 Nashorn 的全局对象变量的主要内容,如果未能解决你的问题,请参考以下文章
访问全局变量时模块的 __setattr__ 和 __getattr__
vue设置了全局http拦截器,如何使某个页面不使用拦截器进行拦截,可以直接敲url访问?