2016-03-16 5 views
11

これは、"Capturing Nashorn's Global Variables"という質問と同じ行に沿っています。グローバルオブジェクトへの変数の代入を傍受できないことを非常に制限しています。例えばNashornのグローバルオブジェクト変数のアクセス/インターセプト

、私はスクリプト "A = 10" をevalし言います。おそらく、「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+""); 
} 

この方法では、コード「= 10」はevalledされたとき、それがスコープ内に「10」を置く代わりの10でしょう。

それは私がグローバルオブジェクトのために、この実装のようなものを提供することができないことを実現するためのBindingsインタフェースを持つ便利だが、イライラします。 ScriptObjectMirrorが最終的なので、私はこれをオーバーロードして、その後のコールを内部のScriptObjectに乗っ取ることはできません。何か不足していますか?だから、基本的にはあなたが何をしたいのか

答えて

0

は、いくつかのオブジェクト上の任意のプロパティに/トラップの割り当てを傍受することです。あなたの場合は、グローバルオブジェクトです。

は私の知る限り、これは確かにかなりハックコードなしで本当に可能ではなかったです。 'observables javascript'を検索するとそれを助けるかもしれませんが、あなたは泥だらけの領域に入ることに注意してください。

プロダクトコードとは対照的に、テストのためのものである場合は、グローバルオブジェクトのすべてのプロパティを定期的に列挙し、追加された場合に警告を記録するリスナーを持つsetTimeout/setIntervalがあります。将来的には

、私たちはこれで私たちを助けるためにJavascript Proxy標準があるでしょうが、私は真剣にそれがNashornではまだそこにある疑い。ナショーンと仕事をしてからしばらくしていましたが、シーンの最初の爆発の後、ナショーンのフロントアウェイで静かでした。

関連する問題