GWTのJSNIを使用して、ネイティブコードを介してJava関数を呼び出そうとしています。Java関数には列挙型が含まれているので、列挙型が希望どおりにマーシャリングされるかどうかを知りたいと思いました。GoogleやSOで役立つものは何も見つかりませんでした。また、Googleの基本的なドキュメントはあまり具体的ではありません。コンパイルして実行するときにわかると思いますが、質問したほうがいいと思いました。
このような非常に単純化されたコードを考えると:
package my.example.package;
public class Giant {
public enum GiantWord { FEE, FIE, FO, FUM };
public void sayGiantWord(GiantWord word) { /* ... */ }
public native JavaScriptObject toJS() /*-{
var Giant = function() {
this.sayGiantWord = function(word) {
this.@my.example.package::sayGiantWord(Lmy/example/package/Giant$GiantWord;)(word);
};
};
return new Giant();
}-*/;
}
編集this
-コメントに基づいて、toJS関数の代替バージョンを提供し、との間の混乱を避けましょうthis.
public static native JavaScriptObject toJS(final Giant g) /*-{
var Giant = function() {
this.sayGiantWord = function(word) {
g.@my.example.package::sayGiantWord(Lmy/example/package/Giant$GiantWord;)(word);
};
};
return new Giant();
}-*/;
sayGiantWord("FEE")
JavaScript内から(から適切に取得されたvarで)呼び出すことはtoJS()
正しく機能しますか?言い換えると、JSNIマーシャラーは文字列を対応するJava列挙型に適切に変換しますか?
intは列挙型に簡単に変換できるため、呼び出しsayGiantWord(1)
は正しくマーシャルする傾向があります。
その他の注意事項:
- GWT Eclipseプラグインは、クラスメンバーの列挙型にアクセスするための構文を私に与えたものです。少なくともこれまでのところ、GWTは私と協力しています。
- 数値を渡したくありません。必要に応じて、Javaクラスの変換関数で次のように文字列を処理できることを知っています。私はむしろそうしません。
public void sayGiantWordJS(String word) {
// convert the string to an enum
// call sayGiantWord
}
アドバイスありがとうございます!