【问题标题】:ScriptEngine - Calling javascript closure from javaScriptEngine - 从 java 调用 javascript 闭包
【发布时间】:2017-10-30 20:47:38
【问题描述】:

我正在尝试使用 ScriptEngine 从 Java 调用 javascript 闭包。请参阅下面的代码 sn-p。为简洁起见,我删除了脚本引擎评估代码。我能够调用具有闭包但没有闭包的函数,感谢任何帮助

//Java代码sn-p

        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;
}

}

hello
name:test,testing
prototype
length
name

【问题讨论】:

    标签: javascript java nashorn javascript-engine


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      相关资源
      最近更新 更多