2015-05-14 13 views
0

假設我有一個Java類Course,它有一些方法testMethod。如何公開此功能,這樣我可以用它用手寫的JavaScript如下交互:如何通過GWT中的某個JavaScript接口公開Java類的功能?

someCourse.testMethod(); 

其中someCourse直接從Java代碼通過一個本地方法傳遞,如:

private native void AssociateCourse(Course course) /*-{ 
    someCourse = course; 
}-*/; 

我在實現這個過程中遇到的主要問題是,GWT不提供任何方式來訪問Course構造函數的原型。例如,以下內容無效:

private native void Expose() /*-{ 
    $wnd.Course = @mypackage.Course; 
}-*/; 

因爲它期望它訪問某個字段,而不是全部。

我想避免使用像gwt exporter這樣的庫,因爲我覺得不得不將它與我的處理應用程序邏輯的源代碼結合起來,這將使我很難區分我的代碼的這兩個方面,這將是一件壞事例如,如果代碼是在像這樣的GWT項目和Android應用程序之間共享的。

回答

0

如果您使用GWT 2.7+,則可以使用新的JSInterop。它隱藏在編譯器標誌後面,但工作得很好。

它仍然是實驗性的,可能會在將來的版本中更改。

看看這個演示:https://www.youtube.com/watch?v=wFMD1GXR2Tg

0

那麼有different ways你可以完成你的問題,這取決於你揭露的東西,量也。

如果只是一些方法,我會使用純JSNI或gQuery

當回答你的問題,在你的類的構造函數可以公開的新實例的方法(我不會修改Java類原型雖然):

public class Course { 
    public Course() { 
     exportMethods(this); 
    } 
    public String testMethod(String s) { 
     return s; 
    } 
    private native void exportMethods(Course c) /*-{ 
     this.testMethod = [email protected]::testMethod(*); 
    }-*/; 
} 

至於你說gwt-exporter意味着包括依賴,但如果你打算處理很多導出的方法,屬性和回調,那就值得。

2.7.0中提供的新東西JsInterop是非常實驗性的,它缺少很多功能,您必須在編譯器中使用實驗性編譯器標誌來啓用它,它幾乎可用於2.8.0,但仍然是實驗性的直到3.0.0,所以我不會相信它的生產項目。

+0

這會導致在課程的每個實例上'testMethod'的冗餘實現,而不僅僅是一個像它的原型那樣的共享對象? –

相關問題