2013-03-07 15 views
6

GWTで外部のJavaScriptがjavaメソッドを実行できるようにするために使用できるこの$ entryメソッドがあります。 説明はドキュメントに表示されていますhttps://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI?hl=fr#callingGWT - 外部のJavaScriptからインスタンスメソッドを呼び出す

ただし、この例には静的メソッドしかありません。私は非静的メソッドのためにそれを書くためにしようとしていると私はそれを呼び出すようにしようとすると、私は例外を取得:ここ

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

は私のコードです:

public native void setRefreshModuleCallback() /*-{ 
    $wnd.refreshModule = $entry(function() { 
     [email protected]::refreshModuleJava(); 
     alert('test'); 
    }); 
}-*/; 

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

私は非常に面白い見つける何そのアラートが呼び出されると、ブラウザに結果が表示されますが、直前の呼び出しは実行されません。

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

+0

私はこのポストを見て、それが役に立たなかったことに注意してください(または私は何かが逃しました)。http://stackoverflow.com/questions/9676960/issue-with-calling-instance-method-from-handwritten- javascript –

答えて

10

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

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

また、実際にコール方法は、だけでなく、それを参照する必要があります。JSNIに、括弧の最初のペアは、仮パラメータ(オーバーロードを明確にする)ためのものであり、あなたは、実際の引数を渡す別のペアが必要になります。[email protected]::refreshModuleJava()()

+0

私は 'var that = this;'を試してみました。それを@Mypackage.MyModule :: refreshModuleJava();と呼びます。まだ同じ動作をします –

+0

追加の情報で回答を更新しましたが、 'var that = this'は少なくともエラーを消さなければなりません。 –

+0

二重括弧で解決しました。ありがとうThomas。 –

関連する問題