Java:从 ScriptEngine javascript 返回一个对象

2024-05-13

我正在尝试使用 Java 来评估 javascript脚本引擎 https://docs.oracle.com/javase/7/docs/api/javax/script/ScriptEngine.html班级。这是我正在尝试做的事情的一个简短示例:

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

我很确定这个should工作...但我很困惑,我会寻求任何我能得到的帮助。


注意:以下内容针对 Java 8,使用Nashorn https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/ engine.

首先,要使代码编译,请删除.value来自println()陈述。obj被声明为类型Object, and Object没有value field.

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

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

那是因为你没有函数,所以你不能调用return。脚本的返回值是最后一个表达式的值,所以就说obj.

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

ScriptObjectMirror实施Bindings https://docs.oracle.com/javase/8/docs/api/javax/script/Bindings.html?is-external=true这反过来又实现了Map<String, Object>,所以你可以打电话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 对象。

如何执行此操作的示例:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:从 ScriptEngine javascript 返回一个对象 的相关文章

随机推荐