这与标题为"捕获Nashorn的全局变量"的问题大致相同.我发现它非常有限,无法拦截变量到全局对象的分配.
例如,假设我评估脚本"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+"");
}
Run Code Online (Sandbox Code Playgroud)
这样,当代码'a = 10'被评估时,它将"10"放在范围而不是10.
它有一个Bindings实现接口的方便,但令人沮丧的是我不能为全局对象提供类似这样的实现.ScriptObjectMirror是最终的,所以我甚至无法超载这个并劫持随后对内部的调用ScriptObject.我错过了什么吗?