【发布时间】:2015-11-10 14:33:13
【问题描述】:
当我使用 Nashorn ScriptObjectMirror.get() 访问 JavaScript 对象的成员变量时,返回的对象的类型似乎是在运行时确定的。例如,如果值适合 Java int,则 get() 似乎返回 Java Integer。如果值不适合 int,get() 似乎返回 Java Long,依此类推。
现在,我使用 instanceof 来检查类型并将值转换为 long。
有没有更方便的方法来获取成员的值而不会丢失并且不检查 Java 中的类型?也许 Nashorn 总是可以给我一个 Java Double,在成员不是数字的情况下抛出一个错误。
我可以想象这是一个相当狭窄的案例,可能不应该由 Nashorn 处理......
例子:
package com.tangotangolima.test.nashorn_types;
import jdk.nashorn.api.scripting.ScriptObjectMirror;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.StringReader;
public class Main {
public static void main(String[] args) throws ScriptException {
final ScriptEngineManager mgr = new ScriptEngineManager();
final ScriptEngine js = mgr.getEngineByName("nashorn");
final String script = "" +
"var p = 1;" +
"var q = " + (Integer.MAX_VALUE + 1L) + ";" +
"var r = {" +
"s: 1," +
"t: " + (Integer.MAX_VALUE + 1L) +
" };";
js.eval(new StringReader(script));
say(js.get("p").getClass().getName()); // -> java.lang.Integer
say(js.get("q").getClass().getName()); // -> java.lang.Long
final ScriptObjectMirror r = (ScriptObjectMirror) js.get("r");
say(r.get("s").getClass().getName()); // -> java.lang.Integer
say(r.get("t").getClass().getName()); // -> java.lang.Long
}
static void say(String s) {
System.out.println(s);
}
}
【问题讨论】:
标签: java java-8 nashorn scriptengine