質問

次のものがあります:

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の間で他のデータ型変換を探す場所を知ることは素晴らしいことです。

ところで、このページを知っているが、本当に探している作業コードのサンプル。

役に立ちましたか?

解決

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);
}

他のヒント

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

Object[] array = ((List<?>) result).toArray();

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]結果変数。その時点で、公開するパブリックメソッドを使用して、キャストして直接処理する必要があると思います。おそらくきれいではありませんが、他のオプションは表示されません。特に、いいRhinoレベルで保証できるのは、 Scriptable (そしておそらく ScriptableObject )のインスタンスになることだけだと思います。配列として使用します。

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

データ中間体としてJSONを使用する一般的なソリューション:

Object result = jsEngine.eval("JSON.stringify(getArray())");    
JsonReader jsonReader = Json.createReader(new StringReader(result.toString()));
JsonArray jsonArray = jsonReader.readArray();
jsonReader.close();
int[] numbers = new int[jsonArray.size()];
int index = 0;
for(JsonValue value : jsonArray){
    numbers[index++] = Integer.parseInt(value.toString());
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top