2017-01-22 11 views
0

Nashornを使用してコンパイルされたJavaScript関数からprint()出力をキャプチャしようとしています。 ScriptEngineを使用する場合に期待されるように、これは専用のScriptContextせずに動作します:コンパイルされたNashorn関数のprint()出力のリダイレクト

ScriptEngine engine = new ScriptEngineManager() 
     .getEngineByName("nashorn"); 

// Create a StringWriter for print() output 
StringWriter myWriter = new StringWriter(); 
engine.getContext().setWriter(myWriter); 

// Compile the functino in the context. 
String code = "function testPrint() {print('Hello World');}"; 
engine.eval(code); 
ScriptObjectMirror fn = (ScriptObjectMirror) engine.getContext() 
     .getAttribute("testPrint"); 

// Call the function and test the output. 
fn.call("testPrint"); 
System.out.println("StringWriter contents: " + myWriter); 

出力:私は孤立ScriptContextでそれを行う場合

StringWriter contents: Hello World 

しかし、print()出力は常にSystem.outに行きます。

ScriptEngine engine = new ScriptEngineManager() 
     .getEngineByName("nashorn"); 

// Set up an isolated context. 
Bindings bindings = engine.createBindings(); 
ScriptContext isolatedContext = new SimpleScriptContext(); 
isolatedContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE); 

// Create a StringWriter for print() output 
StringWriter myWriter = new StringWriter(); 
isolatedContext.setWriter(myWriter); 

// Compile the functino in the context. 
String code = "function testPrint() {print('Hello World');}"; 
engine.eval(code, isolatedContext); 
ScriptObjectMirror fn = (ScriptObjectMirror) isolatedContext 
     .getAttribute("testPrint"); 

// Call the function and test the output. 
fn.call("testPrint"); 
System.out.println("StringWriter contents: " + myWriter); 

これは生成:

Hello World 
StringWriter contents: 

関数が呼び出されたときに、最初の行がSystem.outに印刷されます。 2番目はコードの最後の行の結果で、空のStringWriterを示します。

手動で作成されたコンテキストでコンパイルされた関数を、エンジンのデフォルトコンテキストでコンパイルされたように動作させるにはどうすればよいですか?

答えて

0

SimpleScriptContextsetメソッドを使用してください。

public SimpleScriptContext() { 
     engineScope = new SimpleBindings(); 
     globalScope = null; 
     reader = new InputStreamReader(System.in); 
     writer = new PrintWriter(System.out , true); 
     errorWriter = new PrintWriter(System.err, true); 
    } 

    /** {@inheritDoc} */ 
    public void setReader(Reader reader) { 
     this.reader = reader; 
    } 

    /** {@inheritDoc} */ 
    public void setWriter(Writer writer) { 
     this.writer = writer; 
    } 


    /** {@inheritDoc} */ 
    public void setErrorWriter(Writer writer) { 
     this.errorWriter = writer; 
    } 
関連する問題