如果 Javascript 在您的控制之下,您可以按照此文档在那里进行转换。因此,为了调整您的示例,例如:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
String convertFuncSrc =
"function convertArray(type, arr) {"
+ " var jArr = java.lang.reflect.Array.newInstance(type, arr.length);"
+ " for (var i = 0; i < arr.length; i++) { "
+ " jArr[i] = arr[i];"
+ " }"
+ " return jArr;"
+ "};";
jsEngine.eval(convertFuncSrc);
Object result = jsEngine.eval("convertArray(java.lang.Integer.TYPE, getArray());");
int[] javaArray = (int[])result;
虽然,如果您不能更改 Javascript,这种方法将不起作用,并且您 [i] 将 [/i] 将 sun.org.mozilla.javascript.internal.NativeArray 的实例作为您的result
变量。在这一点上,我认为您只需要使用它公开的任何公共方法直接转换和处理它;它可能不漂亮,但我没有看到任何其他选择。特别是,我认为您可以在好的 Rhino 级别上保证的唯一一件事是它将是Scriptable
(并且可能ScriptableObject
)的一个实例,这无助于您将它用作数组。
凯文的回答看起来像是一个很好的方式(并且类似于我刚刚要编辑的内容!:-))