我试图使用ScriptEngine类在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
}
}我很确定这应该有效..。但我很困惑,我会尽我所能得到帮助的。
发布于 2016-06-26 01:55:49
注意:以下是使用https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/引擎的Java8。
首先,要使代码编译,从.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
}
}更新
重点是创建一个带有函数的对象,这个引擎可以吗?没有函数对象。
关于如何这样做的示例:
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.0https://stackoverflow.com/questions/38034497
复制相似问题