Java:从ScriptEngine javascript返回对象
我试图通过使用类来评估Java中的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
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,了解如何使用它。