gpt4 book ai didi

javascript - Java:从 ScriptEngine javascript 返回一个对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:30 24 4
gpt4 key购买 nike

我正在尝试使用 ScriptEngine 评估 Java 中的 javascript类(class)。这是我正在尝试做的一个简短示例:

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

我很确定这应该工作......但我很困惑,我会接受我能得到的任何帮助。

最佳答案

注意:以下是针对 Java 8 的,使用 Nashorn引擎。

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

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

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 .为了您的方便,我已经链接到 javadoc。

ScriptObjectMirror工具 Bindings 依次实现 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
}
}

更新

The whole point was to create an object with functions, is that possible with this engine? There isn't a Function object.

如何做到这一点的例子:

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

输出

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

关于javascript - Java:从 ScriptEngine javascript 返回一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38034497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com