Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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
ScriptEngine-从java调用javascript闭包_Javascript_Java_Nashorn_Javascript Engine - Fatal编程技术网

ScriptEngine-从java调用javascript闭包

ScriptEngine-从java调用javascript闭包,javascript,java,nashorn,javascript-engine,Javascript,Java,Nashorn,Javascript Engine,我试图使用ScriptEngine从Java调用javascript闭包。请参见下面的代码片段。为了简洁起见,我删除了脚本引擎eval代码。我能够调用有闭包的函数,但没有闭包,非常感谢您的帮助 //Java代码片段 ScriptObjectMirror execute = (ScriptObjectMirror) engine.get("transform"); ScriptObjectMirror closure = (ScriptObjectMirror) execu

我试图使用ScriptEngine从Java调用javascript闭包。请参见下面的代码片段。为了简洁起见,我删除了脚本引擎eval代码。我能够调用有闭包的函数,但没有闭包,非常感谢您的帮助

//Java代码片段

        ScriptObjectMirror execute = (ScriptObjectMirror) engine.get("transform");
    ScriptObjectMirror closure = (ScriptObjectMirror) execute.callMember("execute", new TestObj());
    for (String s: closure.getOwnKeys(true)) {
        System.out.println(s);
    }
//Javascript代码

var transform = {
execute : function(execution) {
    print("hello");execution.setVariable("test","testing");
    function transform(execution) {
        execution.setVariable("result", {result:"myjson object"});
        print("Testing");
    }
    return transform;
}
}


解决了这个问题,下面是完整的工作代码

import jdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Main {

    public static class TestObj {

        public TestObj() {

        }
        public void setVariable(String name, Object value) {
            System.out.println(name + ":" + value);
            if (value instanceof ScriptObjectMirror) {
                ScriptObjectMirror scriptObjectMirror = (ScriptObjectMirror) value;
                String[] ownKeys = scriptObjectMirror.getOwnKeys(true);
                for (String k: ownKeys) {
                    System.out.println(scriptObjectMirror.get(k));
                }
            }
        }
    }

    public static void main(String[] args) throws ScriptException {
        System.out.println("Hello World!");


        ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
        ScriptEngine engine = scriptEngineManager.getEngineByName("javascript");
        String js = "var transform = {\n" +
                "execute : function(execution) {\n" +
                "    print(\"hello\");" +
                "execution.setVariable(\"test\",\"testing\");\n" +
                "    function transform(execution) {\n" +
                "        execution.setVariable(\"result\", {result:\"myjson object\"});\n" +
                "        print(\"Testing\");\n" +
                "    }\n" +
                "    return transform;\n" +
                "}}";
        System.out.println(engine);
        engine.eval(js);
        //engine.put("execution", new TestObj());
        ScriptObjectMirror transform = (ScriptObjectMirror) engine.get("transform");
        ScriptObjectMirror execute = (ScriptObjectMirror) transform.callMember("execute", new TestObj());
        execute.call(execute,new TestObj());
        System.out.println("fully working code");
    }
}
输出

Hello World!
jdk.nashorn.api.scripting.NashornScriptEngine@6d7b4f4c
hello
test:testing
result:[object Object]
myjson object
Testing
fully working code
Hello World!
jdk.nashorn.api.scripting.NashornScriptEngine@6d7b4f4c
hello
test:testing
result:[object Object]
myjson object
Testing
fully working code