Javascript 在编译的Nashorn函数中重定向print()输出
我正在尝试使用Nashorn从编译的JavaScript函数捕获Javascript 在编译的Nashorn函数中重定向print()输出,javascript,java,nashorn,Javascript,Java,Nashorn,我正在尝试使用Nashorn从编译的JavaScript函数捕获print()输出。当使用ScriptEngine而不使用专用的ScriptContext时,这将按预期工作: ScriptEngine engine = new ScriptEngineManager() .getEngineByName("nashorn"); // Create a StringWriter for print() output StringWriter myWriter = new Stri
print()
输出。当使用ScriptEngine
而不使用专用的ScriptContext
时,这将按预期工作:
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);
输出:
StringWriter contents: Hello World
但是,如果我在独立的ScriptContext
中执行此操作,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;第二个是代码最后一行的结果,显示StringWriter为空
如何使在手动构建的上下文中编译的函数的行为类似于使用引擎默认上下文编译的函数?在使用之前,请使用
SimpleScriptContext
的set
方法
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;
}