如何在Java中获取JavaScript返回的数组并转为Java数组?
How to Convert Nashorn's JavaScript Array to a Java Array
我明白你遇到的问题了——当你用Nashorn调用JS函数返回数组时,得到的其实是Nashorn内部的JS数组对象,直接调用toString()就会输出JS对象的默认字符串表示[object Array...]。要把它转换成Java数组,我们可以用两种简单的方式实现:
方法1:直接类型转换(最简便)
如果你的JS数组元素类型统一(比如都是字符串),可以直接将返回的对象强制转换为对应的Java数组类型,Nashorn会自动完成转换逻辑:
import javax.script.*; import java.io.FileReader; public class NashornArrayTest { public static void main(String[] args) { try{ ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(new FileReader("fun.js")); Invocable invocable = (Invocable) engine; // 直接转换为String类型的Java数组 String[] javaArray = (String[]) invocable.invokeFunction("fun1"); // 验证输出 for (String item : javaArray) { System.out.println(item); } } catch(Exception e){ e.printStackTrace(); } } }
如果不确定JS数组的元素类型,也可以先转换为Object[]数组,再根据实际场景处理:
Object[] javaArray = (Object[]) invocable.invokeFunction("fun1");
方法2:借助JSObject接口手动转换
Nashorn的JS数组对象实现了jdk.nashorn.api.scripting.JSObject接口,我们可以通过这个接口的方法来遍历数组元素,手动构建Java数组:
import jdk.nashorn.api.scripting.JSObject; import javax.script.*; import java.io.FileReader; public class NashornArrayTest { public static void main(String[] args) { try{ ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(new FileReader("fun.js")); Invocable invocable = (Invocable) engine; // 获取JS数组对象 JSObject jsArray = (JSObject) invocable.invokeFunction("fun1"); // 构建对应长度的Java数组 String[] javaArray = new String[(int) jsArray.getSlotCount()]; for (int i = 0; i < javaArray.length; i++) { javaArray[i] = (String) jsArray.getSlot(i); } // 验证输出 for (String item : javaArray) { System.out.println(item); } } catch(Exception e){ e.printStackTrace(); } } }
注意事项
- 如果JS数组中包含复杂对象(而非字符串、数字这类基本类型),转换时需要确保对应的Java类型能兼容,否则可能抛出类型转换异常。
- 两种方法都能解决你的问题,优先推荐方法1,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Rahul Choubey
相关产品推荐
相关产品推荐

