当我使用Nashorn ScriptObjectMirror.get()访问JavaScript对象的成员变量时,返回的对象类型似乎是在运行时确定的。例如,如果值适合Java int,则get()似乎返回Java Integer。如果值无法适应int,则get()似乎返回Java Long,依此类推。
现在,我使用instanceof检查类型并将值转换为long。
有没有更方便的方法在Java中获取成员的值而不会丢失,并且不需要检查类型?也许Nashorn总是可以给我一个Java Double,在成员不是数字的情况下抛出错误。
我想象这可能是一个相当狭窄的情况,可能不应该由Nashorn处理...
例子:
现在,我使用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);
}
}