【问题标题】:Can't call hasOwnProperty on Java List with Nashorn无法使用 Nashorn 在 Java 列表上调用 hasOwnProperty
【发布时间】: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 对象?

【问题讨论】:

    标签: java java-8 nashorn


    【解决方案1】:

    您不能以这种方式使用 Java 数组。 Java 数组是“硬连线”的对象。与普通对象不同,它们没有方法,并且支持 [] 运算符,而对象则不能。

    Article about Nashorn at Oracle 说明您需要在您的javascript 中使用Java.toJava.from 方法才能将Java 数组更改为Javascript 数组。

    【讨论】:

      【解决方案2】:

      使用Java.from()将Java的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" +
        "}";
      

      【讨论】:

        猜你喜欢
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多