【发布时间】:2014-11-12 20:07:07
【问题描述】:
我有一个执行大量 javascript 服务器端的应用程序,我正在尝试从 Rhino 转换为 Nashorn,但我的脚本遇到了问题。使用 Rhino,我总是将函数的任何参数转换为 JSON 字符串,但这真的很慢。对于 Nashorn,我试图将参数作为 Java 对象传递,但它们似乎没有从 Javascript 的 Object 类型继承函数。这是一个示例方法,说明了我的数组上没有 hasOwnProperty 的问题:
public String printArrayValues() throws ScriptException, NoSuchMethodException {
String script =
"function printArrayValues(objArray) {\n" +
" var result = '';\n" +
" for(var obj in objArray) {\n" +
" if(objArray.hasOwnProperty(obj)) {\n" +
" result = result + ' ' + objArray[obj];\n" +
" }\n" +
" }\n" +
" return result;\n" +
"}";
List<String> data = Arrays.asList(new String[]{ "one", "two", "three"});
ScriptEngine scriptEngine = new NashornScriptEngineFactory().getScriptEngine();
scriptEngine.eval(script);
String result = (String) ((Invocable) scriptEngine).invokeFunction("printArrayValues", data);
}
这里调用invokeFunction抛出异常:
javax.script.ScriptException: TypeError: [one, two, three] has no such function "hasOwnProperty" in <eval> at line number 4
如果我在浏览器中调用相同的函数,我会得到预期的结果:
> printArrayValues(["one", "two", "three"]);
> " one two three"
有没有什么方法可以做到这一点,所以我真的可以使用这些 Java 对象,而无需将它们转换为 JSON 字符串,然后将其评估为 Javascript 对象?
【问题讨论】: