我有一个执行大量javascript服务器端的应用程序,我试图从Rhino转换到Nashorn,但是我的脚本遇到了麻烦。使用Rhino,我总是将函数的任何参数转换为JSON字符串,但这非常慢。对于Nashorn,我只是尝试将参数作为Java对象传递,但它们似乎并不继承Javascript的对象类型的函数。下面是一个示例方法,它说明了在我的数组中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对象。
发布于 2014-11-12 20:35:04
您不能以这种方式使用Java数组。Java数组是“硬连接”对象。与普通对象不同,它们没有方法,它们支持[]操作符,而对象不能。
这个关于甲骨文纳什霍恩的文章解释说,为了将Java.to数组更改为javascript数组,您需要使用Javascript中的Java.to和Java.from方法。
发布于 2014-11-12 21:26:06
使用Java.from()将List转换为Javascript Array,然后对其进行操作。
String script =
"function printArrayValues(objArray) {\n" +
" var result = '';\n var temp = Java.from(objArray);" +
" for(var obj in temp ) {\n" +
" if(temp .hasOwnProperty(obj)) {\n" +
" result = result + ' ' + temp [obj];\n" +
" }\n" +
" }\n" +
" return result;\n" +
"}";https://stackoverflow.com/questions/26895632
复制相似问题