2016-07-02 5 views
3

からすべてのバインディングを取得し、私はいくつかのバインディングを作成し、エンジンに渡され、グローバルスコープJS側で今のJava nashorn - javascrict

Bindings bindings = new SimpleBindings(); 
bindings.put... 
scriptEngine.setBindings(bindings, ScriptContext.ENGINE_SCOPE); 
Bindings bindings1 = new SimpleBindings(); 
bindings1.put... 
scriptEngine.setBindings(bindings1, ScriptContext.GLOBAL_SCOPE); 

私は、特定のスコープ内のすべてのつきバインディングを印刷したいと思います。

どうすればいいですか?

答えて

1

エンジンへの参照を保持するオブジェクトにバインディングを追加し、そこからキーリストを解析するメソッドを作成することができます。このような何か:

package nashor; 

import java.io.FileNotFoundException; 
import java.io.FileReader; 

import javax.script.*; 

public class NashorMain { 

    public static void main (String[] args) throws ScriptException { 

     ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn");  
     Bindings b = nashorn.createBindings(); 
     b.put("global", "GLOBAL"); 
     nashorn.setBindings(b, ScriptContext.GLOBAL_SCOPE); 

     b = nashorn.createBindings(); 
     b.put("info", new NashorInfo(nashorn)); 
     b.put("engineVar", "engine"); 
     nashorn.setBindings(b, ScriptContext.ENGINE_SCOPE); 

     nashorn.eval("newEngineVar = 'engine'"); 
     nashorn.eval("print('Engine vars:'); for each (var key in info.getEngineScopeKeys()) print (key)"); 
     nashorn.eval("print();print('Global vars:'); for each (var key in info.getGlobalScopeKeys()) print (key)"); 
    } 

    public static class NashorInfo { 

     private ScriptEngine scriptEngine; 

     public NashorInfo (ScriptEngine scriptEngine) { 
      this.scriptEngine = scriptEngine; 
     } 

     public String[] getEngineScopeKeys() { 
      return scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).keySet().toArray(new String[]{}); 
     } 

     public String[] getGlobalScopeKeys() { 
      return scriptEngine.getBindings(ScriptContext.GLOBAL_SCOPE).keySet().toArray(new String[]{}); 
     } 
    } 


} 

上記のプログラムの出力は

Engine vars: 
info 
engineVar 
newEngineVar 
key 

Global vars: 
global 
です
関連する問題