Can';使用Nashorn调用Java列表上的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

我有一个在服务器端执行大量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);
}

有什么方法可以做到这一点,这样我就可以真正使用这些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" +
  "}";