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を示します。
手動で作成されたコンテキストでコンパイルされた関数を、エンジンのデフォルトコンテキストでコンパイルされたように動作させるにはどうすればよいですか?