Can';使用Nashorn调用Java列表上的hasOwnProperty
我有一个在服务器端执行大量javascript的应用程序,我正在尝试从Rhino转换到Nashorn,但我的脚本遇到了麻烦。使用Rhino,我总是将函数的任何参数转换为JSON字符串,但这真的很慢。对于Nashorn,我试图将参数作为Java对象传入,但它们似乎没有从Javascript的对象类型继承函数。下面是一个示例方法,说明了我的问题,其中hasOwnProperty在我的数组中不可用:Can';使用Nashorn调用Java列表上的hasOwnProperty,java,java-8,nashorn,Java,Java 8,Nashorn,我有一个在服务器端执行大量javascript的应用程序,我正在尝试从Rhino转换到Nashorn,但我的脚本遇到了麻烦。使用Rhino,我总是将函数的任何参数转换为JSON字符串,但这真的很慢。对于Nashorn,我试图将参数作为Java对象传入,但它们似乎没有从Javascript的对象类型继承函数。下面是一个示例方法,说明了我的问题,其中hasOwnProperty在我的数组中不可用: public String printArrayValues() throws ScriptExcep
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);
}
有什么方法可以做到这一点,这样我就可以真正使用这些Java对象,而不必将它们转换为JSON字符串,然后将其转换为Javascript对象?您不能以这种方式使用Java数组。Java数组是“硬连线”对象。与普通对象不同,它们没有方法,并且支持
[]
操作符,而对象不能
这说明您需要在javascript中使用Java.to
和Java.from
方法将Java数组更改为javascript数组。使用Java.from()
将Java列表
转换为javascript数组
,然后对其进行操作
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" +
"}";
> printArrayValues(["one", "two", "three"]);
> " one two three"
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" +
"}";