将Javascript数组转换为Java数组

3
我正在尝试将Java中的Javascript数组转换为Java数组。我正在使用javax.script包。 我测试了这个例子,但是类型“NativeArray”无法被识别:https://dev59.com/YHM_5IYBdhLWcg3wThR3#1433489 如何让“NativeArray”类型被识别?

那个“NativeArray”类在另一个问题中是Rhino的东西,所以如果你正在使用ScriptEngine机制,我认为它不可用(至少没有任何“干净”的方式)。 - Pointy
1
... 错误,可能是 sun.org.mozilla.javascript.internal.NativeArray - Pointy
1
访问限制:由于所需库 /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar 上的限制,类型 NativeArray 不可访问。 - Anderson Green
4个回答

3
Rhino提供了这个:

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Embedding_tutorial#usingJSObjs

此外,Scriptable 接口提供了 get() 和 set() 方法,因此您可以轻松枚举对象的属性并将其添加到数组中:
Scriptable arr = (Scriptable) result;
Object [] array = new Object[arr.getIds().length];
for (Object o : arr.getIds()) {
   int index = (Integer) o;
   array[index] = arr.get(index, null);
}

使用相同的方法,但不使用NativeArray,因为它似乎是Rhino特定的东西。您可以轻松地放置断点,查看您所获得的对象类型,然后将其转换为该类型。这是某种JS数组实现,非常接近于NativeArray。

2
根据这个答案,看起来你最好的选择是编写一个JavaScript转换函数,将原生JavaScript数组转换为使用Rhino的Java绑定功能的Java数组。请注意,在转换单个元素时必须使用正确的类型。

[编辑] 这里有一个使用字符串数组的工作示例:

ScriptEngine js = new ScriptEngineManager().getEngineByName("JavaScript");
String ss[] = (String[]) js.eval(
    "(function() {" +
    "  var a = java.lang.reflect.Array.newInstance(java.lang.String, 3);" +
    "  a[0] = 'foo';" +
    "  a[1] = 'bar';" +
    "  a[2] = 'gah';" +
    "  return a;" +
    "})()");
System.out.println(Arrays.toString(ss)); // => [foo, bar, gah]

主线程中的异常:javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:无法找到方法java.lang.reflect.Array.newInstance(string,number)。 (<Unknown source>#120)在<Unknown source>的第120行 在com.sun.script.javascript.RhinoScriptEngine.invoke(RhinoScriptEngine.java:255)处 在com.sun.script.javascript.RhinoScriptEngine.invokeFunction(RhinoScriptEngine.java:213)处调用 在JavascriptInJava.main(JavascriptInJava.java:75)处。 - Anderson Green
当我添加了以下代码时:var jArr = java.lang.reflect.Array.newInstance(String, sortedParms.length);其中sortedParms.length是一个数组的长度,我遇到了上述错误。看起来该方法未定义,尽管它应该在链接中给出的示例中有效。有没有解决这个问题的方法? - Anderson Green
1
@AndersonGreen:尝试使用参数java.lang.String,根据我的更新答案。 - maerics
@AndersonGreen:很高兴听到这个消息!请随意为我的答案点赞或按“检查”按钮接受它作为正确答案。 - maerics

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接