【问题标题】:Get array as result of ScriptEngine.eval()获取数组作为 ScriptEngine.eval() 的结果
【发布时间】:2016-07-11 14:42:42
【问题描述】:

我正在尝试使用 javax.script.ScriptEngine 来eval() 一些 JS 脚本。 我如何知道eval() 之后的结果是否为Object 类型的数组?如果是这样,我该如何施放它?

现在,要知道对象是数字类型还是字符串类型,我使用instanceof。当脚本的结果是一个数组时,如果我使用System.out.println() 打印,则返回的对象只会打印[object Array]

【问题讨论】:

    标签: javascript java arrays


    【解决方案1】:

    正如您所注意到的,它不是 java 数组而是一个 javascript 数组,如果您打印返回对象的类,您可能会发现它是“ScriptObjectMirror”。我对此有一个解决方法,即在另一个脚本变量中将数组插入字符串,然后获取该数组的值(参见下面的示例)。我相信有更好的方法来解决这个数组问题,也在等待好的答案。

    engine.eval("var fruits = [\"Banana\", \"Orange\", \"Apple\", \"Mango\"]; var d = fruits.toString();");
    System.out.println(engine.get("fruits").getClass());
    System.out.println(engine.get("d").getClass());
    System.out.println(engine.get("d"));
    

    【讨论】:

      【解决方案2】:

      在我的例子中,修改脚本以使其返回列表就可以了:

      private String arrayToList() {
          if (javascript.startsWith("[") && javascript.endsWith("]"))
              javascript = "java.util.Arrays.asList(" + javascript + ")";
          return javascript;
      }
      

      当然它只处理使用括号产生数组的情况,例如:

      ["entry1", "entry2", settings.getMainUserEmail(), loginEmail]
      

      无论如何,底线是您需要返回 List 而不是数组。然后你也可以使用instanceof

      【讨论】:

        【解决方案3】:

        如何知道 eval() 之后的 Object 类型的结果是不是一个数组?

        使用instanceof

        if(result instanceof Object[]){
            //your code
        }
        

        如果是这样,我该如何施放它?

        if(result instanceof Object[]){
            Object[] array = (Object[])result;
            for(Object o : array) {
            //your code
            }
        }    
        

        【讨论】:

        • 那行不通。 if 语句中的instanceof 返回 false。
        猜你喜欢
        • 1970-01-01
        • 2016-05-27
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2017-02-09
        • 2019-02-19
        相关资源
        最近更新 更多