Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在编译的Nashorn函数中重定向print()输出_Javascript_Java_Nashorn - Fatal编程技术网

Javascript 在编译的Nashorn函数中重定向print()输出

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

我正在尝试使用Nashorn从编译的JavaScript函数捕获
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;
    }