Java:从ScriptEngine javascript返回对象

Java:从ScriptEngine javascript返回对象,javascript,java,eval,Javascript,Java,Eval,我试图通过使用类来评估Java中的javascript。以下是我正在尝试做的一个简短示例: import javax.script.ScriptEngineManager; import javax.script.ScriptEngine; public class Test { public static void main(String[] args) { ScriptEngine engine = new ScriptEngineManager().getEngi

我试图通过使用类来评估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
    }
}
我很确定这应该行得通。。。但是我被难住了,我会接受任何我能得到的帮助。

注意:下面是关于Java8的,使用引擎

首先,要编译代码,请从
println()
语句中删除
.value
obj
被声明为类型
对象
,并且
对象
没有
字段

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

线程“main”javax.script.ScriptException::1:25中的异常返回语句无效 var obj={value:1};返回obj; ^在第1行第25列中 这是因为您没有函数,所以无法调用
return
。脚本的返回值是最后一个表达式的值,所以只需说
obj

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

ScriptObjectMirror
实现,后者反过来实现
Map
,因此您可以调用
get(“value”)

工作守则如下:

import javax.script.*;
公开课考试{
公共静态void main(字符串[]args)引发脚本异常{
ScriptEngine=new ScriptEngineManager().getEngineByName(“js”);
Bindings obj=(Bindings)engine.eval(“var obj={value:1};obj;”);
整数值=(整数)obj.get(“值”);
System.out.println(值);//打印:1
}
}
更新

整个要点是创建一个具有函数的对象,这个引擎可以吗?没有函数对象

如何做到这一点的示例:

导入javax.script.ScriptEngine;
导入javax.script.ScriptEngineManager;
导入jdk.nashorn.api.scripting.ScriptObjectMirror;
公开课考试{
公共静态void main(字符串[]args)引发异常{
String script=“var f={\n”+
值:0\n+
“添加:函数(n){\n”+
“this.value+=n;\n”+
“返回此.value;\n”+
“}\n”+
“};\n”+
“f;//将对象返回到Java\n”;
ScriptEngine=new ScriptEngineManager().getEngineByName(“js”);
ScriptObjectMirror obj=(ScriptObjectMirror)引擎.eval(脚本);
System.out.println(“obj.value=“+obj.getMember(“value”));
System.out.println(“对象添加(5):”+obj.callMember(“添加”,5));
System.out.println(“对象添加(-3):”+obj.callMember(“添加”,-3));
System.out.println(“obj.value=“+obj.getMember(“value”));
}
}
输出

obj.value=0
对象添加(5):5.0
对象添加(-3):2.0
对象值=2.0

如果您放下
返回obj,它是否有效?Return语句应该在函数中,但我不知道该类如何计算JS代码;我刚刚看到了几个示例和文档。我在ommiting时也会遇到同样的错误。可能是因为
var
语句不会返回对象本身。只需要用括号括起来的对象就可以了。对于有效的程序来说,参数是必需的。@斜视操作有一个编译错误,(在
println()
语句的注释中提到的“无效令牌错误”),而不是运行时错误。安德烈亚斯:我知道,看看我的第一句话。我只是说无论是
var obj={value:1}
nor
{value:1}
可能会工作,因为这两条语句都不会单独生成对象,而
({value:1})
会工作。
/tmp/java_4eJZg9/Test.java:16:error:unreported exception ScriptException;必须捕获或声明为抛出绑定obj=(Bindings)engine.eval(“var obj={value:1};obj;”);^在求值后的括号中出现了一个错误
。因此,将
抛出ScriptException
添加到
main()
。伙计,我太笨了。谢谢你的帮助。我知道这个问题已经回答了,但是我似乎不能对字符串使用相同的代码。另外,是否可以在javascript中为函数设置值,然后在Java中执行该函数?这就是本文的全部目的,它是为了创建动态函数。是的,按照我描述的做。打印返回对象的类名,以便查看得到的内容。然后检查javadoc,了解如何使用它。