Java:从ScriptEngine javascript返回一个对象

我正在尝试使用ScriptEngine类来评估Java中的javascript。 这是我想要做的一个简短的例子:

import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Test { public static void main(String[] args) { ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); //Creates a ScriptEngine Object obj = engine.eval("var obj = { value: 1 }; return obj; "); // Evals the creation of a simple object System.out.println(obj.value); // I get an invalid token error when trying to print a property of the object } } 

我很确定这应该有用……但是我很难过,我会接受任何帮助。

注意:以下内容适用于使用Nashorn引擎的Java 8。

首先,要编译代码,请从println()语句中删除.valueobj声明为Object类型, Object没有value字段。

执行此操作后,运行代码时会出现以下exception:

 Exception in thread "main" javax.script.ScriptException: :1:25 Invalid return statement var obj = { value: 1 }; return obj; ^ in  at line number 1 at column number 25 

那是因为你没有function,所以你不能回电。 脚本的返回值是最后一个表达式的值,所以只需说obj

现在它将运行并打印[object Object] 。 要查看您返回的对象类型,请更改为println(obj.getClass().getName()) 。 这将打印jdk.nashorn.api.scripting.ScriptObjectMirror 。 为了您的方便,我已经链接到javadoc。

ScriptObjectMirror实现了Bindings ,而ScriptObjectMirror又实现了Map ,因此您可以调用get("value")

工作代码是:

 import javax.script.*; public class Test { public static void main(String[] args) throws ScriptException { ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); Bindings obj = (Bindings)engine.eval("var obj = { value: 1 }; obj; "); Integer value = (Integer)obj.get("value"); System.out.println(value); // prints: 1 } } 

UPDATE

重点是创建一个具有function的对象,这个引擎是否可能? 没有Function对象。

如何做到的示例:

 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import jdk.nashorn.api.scripting.ScriptObjectMirror; public class Test { public static void main(String[] args) throws Exception { String script = "var f = {\n" + " value: 0,\n" + " add: function(n) {\n" + " this.value += n;\n" + " return this.value;\n" + " }\n" + "};\n" + "f; // return object to Java\n"; ScriptEngine engine = new ScriptEngineManager().getEngineByName("js"); ScriptObjectMirror obj = (ScriptObjectMirror)engine.eval(script); System.out.println("obj.value = " + obj.getMember("value")); System.out.println("obj.add(5): " + obj.callMember("add", 5)); System.out.println("obj.add(-3): " + obj.callMember("add", -3)); System.out.println("obj.value = " + obj.getMember("value")); } } 

OUTPUT

 obj.value = 0 obj.add(5): 5.0 obj.add(-3): 2.0 obj.value = 2.0