8

この$entryメソッドは、外部javascriptがjavaメソッドを実行できるようにするためにGWTで使用できます。説明は、ドキュメントhttps://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#callingで確認できます。

ただし、そこにある例は静的メソッドのみです。非静的メソッド用に記述しようとしていますが、呼び出そうとすると例外が発生します。

java.lang.ClassCastException: Cannot cast com.google.gwt.core.client.JavaScriptObject$ to mypackage.MyModule

これが私のコードです:

public native void setRefreshModuleCallback() /*-{
    $wnd.refreshModule = $entry(function() {
        this.@mypackage.MyModule::refreshModuleJava();
        alert('test');
    });
}-*/;

public void refreshModuleJava() {
    logger.log(Level.WARNING, "REFRESH");
}

私が非常に面白いと思うのは、アラートが呼び出され、ブラウザに結果が表示されますが、直前の呼び出しは実行されないということです。

そのようなことが実際に可能かどうか知っていますか?

4

1 に答える 1

11

$entryこれは、 Javaを呼び出すことではなく、GWTでいくつかのことがうまくいくようにすることです。例外はにルーティングされ、コマンドはを介しGWT.UncaughtExceptionHandlerスケジュールされ、正しく呼び出されます。 Scheduler#scheduleEntryScheduler#scheduleFinally

あなたの問題はthisです。関数が呼び出されたとき、はクラスでthisはありませんMyModule(おそらく$wndオブジェクトです)。これが、リンクした質問がを使用する理由ですvar that = this。それはスコーピングについてです。

また、メソッドを参照するだけでなく、実際に呼び出す必要があります。JSNIでは、最初のペアの親は(オーバーロードを明確にするための)正式なパラメーター用であり、実際の引数を渡す別のペアが必要ですthat.@mypackage.MyModule::refreshModuleJava()()

于 2013-03-07T15:37:58.663 に答える