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 を変更できない場合、このアプローチは機能せず、sun.org.mozilla.javascript.internal.NativeArray のインスタンスを変数として[i]使用します[/i] result
。その時点で、それが公開するパブリックメソッドを使用して、キャストして直接処理する必要があると思います。おそらくきれいではありませんが、他のオプションはありません。特に、素敵な Rhino レベルで保証できる唯一のことは、Scriptable
(そしておそらくScriptableObject
) のインスタンスになることであり、配列として使用するのに役立ちません。
ケビンの答えは、ここに行くのに良い方法のように見えます(そして、私が編集しようとしていたものと似ています! :-))