6

新しいプロジェクトの一環として、GWTをすばやく習得しようとしています。GWTはJavaのString.format()関数を実装していないため、printf()のような機能はありません。Javascript用にいくつかのprintf()実装が存在することを知っていたので、そのうちの1つをGWTJavascriptネイティブインターフェイス関数として貼り付けることができると思いました。問題が発生したので、varargs値が正しく渡されていることを確認したほうがよいと判断しました。それは物事が醜くなったところです。まず、いくつかのサンプルコード:

// From Java, call the JSNI function:
test("sourceString", "params1", "params2", "params3");

....

public static native void test(Object... params) /*-{   
    // PROBLEM: this kills GWT!
    // alert(params.length);  

    // returns "function"
    alert(typeof(params));      

    // returns "[Ljava.lang.Object;@b97ff1"
    alert(params);
}-*/;

GWTのドキュメントには、「Javaからvarargs JavaScriptメソッドを呼び出すと、呼び出し先が配列内の引数を受け取ることになります」と記載されています。つまり、少なくともparams.lengthをチェックできると思いましたが、それにアクセスすると、UmbrellaExceptionにラップされたJavascriptExceptionがスローされ、実際の情報はありません。「typeof(params)」を実行すると、「function」が返されます。それが十分に奇妙ではなかったかのように、paramsの文字列値をチェックすると、Java参照の文字列バージョンのように見えるものが返されます。

だから、私はここでいくつかの異なる質問をしていると思います:

1)GWT / JSNI varargsは実際にどのように機能し、値を渡すために何か特別なことをする必要がありますか?
2)ここで実際に何が起こっているのですか?
3)GWTアプリケーションでprintf()スタイルのフォーマットを取得する簡単な方法はありますか?

4

1 に答える 1

5

JSNIメソッドは引数を受け取っていますが、残念ながら、引数を使用して何もできません。Java配列(varargsは、渡された引数の配列を作成することによって実装されます)は、JSNIメソッドに渡されるときに不透明になります。ただし、 JsArrayStringを使用して目標を達成することはできます。

public static native void test(JsArrayString strings) /*-{
  // strings is a normal JavaScript array of strings
}

そしてメソッドを呼び出す:

String[] jStrings = {"one", "two", "three"};
JsArrayString jsStrings = (JsArrayString)JsArrayString.createArray();

for (String s : jStrings) {
  jsStrings.push(s);
}

test(jsStrings);
于 2011-02-23T00:28:51.730 に答える