Если 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
), что не поможет вам использовать его в качестве массива.
Ответ Кевина выглядит как хороший способ пойти сюда (и похож на то, что я только что собирался редактировать!: -))