2016-03-16 11 views
11

Questa è la stessa linea della domanda dal titolo "Capturing Nashorn's Global Variables". Trovo molto limitante non poter intercettare l'assegnazione di variabili all'oggetto globale.Accesso/intercettazione delle variabili oggetto globali di Nashorn

Ad esempio, supponiamo di evalidare lo script "a = 10". Forse voglio chiamare un ascoltatore per notificare qualcosa che "a" è stato aggiunto all'ambito. L'unico modo per farlo è investigare l'oggetto globale dopo che lo script è stato valutato.

Oppure dire che voglio intercettare un oggetto assegnato all'ambito globale e sostituirlo con un altro; se stava usando Bindings ho potuto implementare put, e delegare fuori ad alcuni altri attacchi:

public Object put(String name, Object value) { 
    //put a toStringed version of the object in scope 
    return delegate.put(name, value+""); 
} 

In questo modo, quando viene evalled il codice 'a = 10', sarebbe mettere "10" in ambito invece di 10

È utile avere un'interfaccia Bindings da implementare, ma è frustrante non poter fornire qualcosa come questa implementazione per l'oggetto globale. ScriptObjectMirror è definitivo, quindi non posso nemmeno sovraccaricare questo e dirottare la chiamata successiva al numero interno ScriptObject. Mi sto perdendo qualcosa?

risposta

0

Quindi in pratica quello che si vuole fare è intercettare/trap assegnare assegnazioni a proprietà arbitrarie su qualche oggetto. Nel tuo caso, l'oggetto globale.

Afaik, questo non è mai stato possibile senza un codice piuttosto hacky. Una ricerca di "osservabili javascript" potrebbe aiutarti, ma tieni presente che entrerai in un territorio fangoso.

Se questo è destinato per il test (al contrario di codice di produzione), un setTimeout/setInterval con qualche ascoltatore che enumera periodicamente tutte le proprietà dell'oggetto globale e registra un avviso se uno è stato aggiunto potrebbe essere abbastanza buono per voi.

In futuro avremo lo standard Javascript Proxy per aiutarci, ma dubito seriamente che ci sia ancora a Nashorn. È passato un po 'di tempo da quando ho lavorato con Nashorn, ma dopo l'esplosione iniziale sulla scena è stato silenzioso l'afaict del fronte di Nashorn ...