访问/拦截 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__

如何在R中的向量中包含变量?

访问 Class 对象以与全局变量进行比较

vue设置了全局http拦截器,如何使某个页面不使用拦截器进行拦截,可以直接敲url访问?

Retrofit2 Authorization - 访问令牌的全局拦截器

数据访问与全局变量