首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:从ScriptEngine javascript返回对象

Java:从ScriptEngine javascript返回对象
EN

Stack Overflow用户
提问于 2016-06-26 01:38:27
回答 1查看 15.8K关注 0票数 14

我试图使用ScriptEngine类在Java中评估javascript。下面是我试图做的一个简短的例子:

代码语言: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
    }
}

我很确定这应该有效..。但我很困惑,我会尽我所能得到帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-26 01:55:49

注意:以下是使用https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/引擎的Java8。

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

这样做后,在运行代码时会得到以下异常:

代码语言:javascript
复制
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")

工作守则是:

代码语言:javascript
复制
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
    }
}

更新

重点是创建一个带有函数的对象,这个引擎可以吗?没有函数对象。

关于如何这样做的示例:

代码语言:javascript
复制
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"));
    }
}

输出

代码语言:javascript
复制
obj.value = 0
obj.add(5): 5.0
obj.add(-3): 2.0
obj.value = 2.0
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38034497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档