18

私は次のものを持っています:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
Object result = jsEngine.eval("getArray();");

タイプがsun.org.mozilla.javascript.internal.NativeArrayの結果オブジェクトを対応するJava配列に変換するにはどうすればよいですか? これが行われている実際のコードサンプルを誰かに見せてもらえますか? 文字列および整数配列で機能するはずです。さらに、rhino エンジンと Java の間の他のデータ型変換を探す場所を知っておくと便利です。

ところで、私はこのページを知っていますが、実際に動作するコード サンプルを探しています。

4

5 に答える 5

24
NativeArray arr = (NativeArray) result;
Object [] array = new Object[(int) arr.getLength()];
for (Object o : arr.getIds()) {
    int index = (Integer) o;
    array[index] = arr.get(index, null);
}
于 2009-09-16T14:49:43.007 に答える
9

この質問が最初に尋ねられたときだったかどうかはわかりませんがNativeArray、インターフェースを実装していjava.util.Listます。したがって、実際の Java 配列に変換する簡単な方法は次のとおりです。

Object[] array = ((List<?>) result).toArray();
于 2013-12-05T16:09:25.643 に答える
8

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) のインスタンスになることであり、配列として使用するのに役立ちません。

ケビンの答えは、ここに行くのに良い方法のように見えます(そして、私が編集しようとしていたものと似ています! :-))

于 2009-09-16T14:47:57.987 に答える