2013-03-07 55 views
6

我們可以在GWT中使用$ entry方法來允許外部javascript執行java方法。 您可以在其文檔中看到解釋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 – 2013-03-07 15:30:07

回答

10

$entry是不是調用Java,它是關於確保幾件事GWT順利:異常被路由到GWT.UncaughtExceptionHandler和命令通過Scheduler#scheduleEntryScheduler#scheduleFinally計劃正確調用。您的問題是this。當函數被調用時,this不是你的MyModule類(它最可能是$wnd對象)。這就是爲什麼你鏈接到的問題使用var that = this。這是關於範圍

您還需要實際呼叫的方法,不僅引用它:在JSNI,第一對括號的是形式參數(消除歧義過載),你需要另一對通過實際的參數:[email protected]::refreshModuleJava()()

+0

我試着'var that = this;'並調用'that。@ mypackage.MyModule :: refreshModuleJava();'並仍然得到相同的行爲 – 2013-03-07 15:49:36

+0

更新的答案與其他信息,但是'var that = this'應該至少使錯誤消失。 – 2013-03-07 16:58:44

+0

雙括號解決了它。謝謝托馬斯。 – 2013-03-08 07:24:44