2012-01-13 30 views
3

JavaのJavascript配列をJava配列に変換しようとしています。私はjavax.scriptパッケージを使用しています。 ここでこの例をテストしましたが、タイプ "NativeArray"が認識されませんでした:https://stackoverflow.com/a/1433489/975097Javascript配列をJava配列に変換する

NativeArrayタイプを認識させるにはどうしたらいいですか?

+0

他の質問の「NativeArray」クラスはRhinoのものなので、ScriptEngineメカニズムを使用している場合は、使用可能とは思われません(少なくとも「クリーン」な方法ではない)。 – Pointy

+1

... err、 'sun.org.mozilla.javascript.internal.NativeArray' – Pointy

+1

アクセス制限:必要なライブラリ/ usr/lib/jvm/java-6-openjdkの制限により、NativeArray型にアクセスできません/jre/lib/rhino.jar –

答えて

2

this answerJava array using Rhino's Java binding functionalityにネイティブJavaScript配列を変換するJavaScriptコンバーター関数を記述するのが最善の方法です。個々の要素を変換するときは、適切な型を使用するように注意しなければならないことに注意してください。

ScriptEngine js = new ScriptEngineManager().getEngineByName("JavaScript"); 
String ss[] = (String[]) js.eval(
    "(function() {" + 
    " var a = java.lang.reflect.Array.newInstance(java.lang.String, 3);" + 
    " a[0] = 'foo';" + 
    " a[1] = 'bar';" + 
    " a[2] = 'gah';" + 
    " return a;" + 
    "})()"); 
System.out.println(Arrays.toString(ss)); // => [foo, bar, gah] 
+0

スレッド "main"の例外javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:メソッドjava.lang.reflect.Array.newInstance(string、number)が見つかりません。 (Unknown source>#120)を行番号120で入力してください。 \t com.sun.script.javascript.RhinoScriptEngine.invoke(RhinoScriptEngine.java:255) \t com.sun.script.javascript.RhinoScriptEngine .invokeFunction(RhinoScriptEngine.java:213) \t JavascriptInJava.main(JavascriptInJava.java:75) –

+0

この行を追加したときに上記のエラーが発生しました。var jArr = java.lang.reflect.Array.newInstance(String、sortedParms .length); where sortedParms.lengthは配列の長さです。メソッドが定義されていないように見えますが、たとえリンクで指定された例で動作するはずです。このための回避策はありますか? –

+1

@AndersonGreen:私の更新された答えに従って、 'java.lang.String'引数を使ってみてください。 – maerics

3

Rhinoは、この提供しています参照してください。

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Embedding_tutorial#usingJSObjs

また、スクリプト可能なインタフェースは、(()を取得できますし、設定を)ので、簡単にオブジェクトのプロパティを列挙し、配列に追加することができました:それはRhinoの特定のもののように見えるので、NativeArrayを使用して

Scriptable arr = (Scriptable) result; 
Object [] array = new Object[arr.getIds().length]; 
for (Object o : arr.getIds()) { 
    int index = (Integer) o; 
    array[index] = arr.get(index, null); 
} 

同じことはありません。あなたは簡単にブレークポイントを落として、あなたが与えられたオブジェクトのタイプを見てそれにダウンキャストすることができます。これは、NativeArrayにかなり近いJS Array実装のようなものです。

関連する問題