hjk*_*321 11 javascript java eval
我正在尝试使用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
}
}
Run Code Online (Sandbox Code Playgroud)
我很确定这应该有效...但我很难过,我会得到任何帮助.
And*_*eas 12
注意:以下内容适用于使用Nashorn引擎的Java 8 .
首先,要使代码编译,请.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
Run Code Online (Sandbox Code Playgroud)
那是因为你没有功能,所以你不能打电话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
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
重点是创建一个具有功能的对象,这个引擎有可能吗?没有Function对象.
如何做到的示例:
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT
obj.value = 0
obj.add(5): 5.0
obj.add(-3): 2.0
obj.value = 2.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10671 次 |
| 最近记录: |