2012-02-29 60 views
1

我想要訪問當前處於JavaScriptObject屬性但轉換失敗的Java對象。這是我做的:將JavaScriptObject轉換爲Java對象在GWT中失敗

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{ 
    return obj['myProp']; 
}-*/; 

obj.myProp是一個Java對象,它是由Java構造函數創建的(它在Javascript中可見,因爲它被導出)。運行上述代碼時的結果是在開發模式下的java.lang.ClassCastException。

但是,如果像下面這樣做並訪問祕密屬性g它的作品!看起來,gwt在轉換返回值時不會移除包裝器。

public static native MyJavaObject getMyObject(JavaScriptObject obj) /*-{ 
    return obj['myProp'].g; 
}-*/; 

上面的代碼工作,但它不是一個解決方案,因爲它使用gwt中的實現細節。我究竟做錯了什麼?

感謝/約翰

通過測試發現的一些新的結論:

看來問題依賴於GWT出口國出口,因爲我預計在本機代碼不會被轉換的對象。

  • 導出的對象被包裝並且原始對象存儲在名爲g的屬性中。
  • 由於GWT不知道這個,它不能從包裝的導出對象中檢索原始對象。
  • 當通過導出的接口進行包裝和解包時是自動的。
  • 這個異常似乎是在本機方法中執行處理導出對象的代碼時。本機方法的行爲與定義爲javascript的代碼行爲不同,因爲它們似乎無法處理導出解包。這是通過嘗試調用導出對象作爲參數的導出方法找到的。它從本機代碼失敗,但從普通的JavaScript工作相同。

有人可以知道gwt-exporter中的實現細節來確認我的假設嗎?

+0

Do MyJavaObject是否擴展了JavaScriptObject? 如果不這樣做,請嘗試這樣做。 – Nicocube 2012-02-29 16:58:51

+0

請勿嘗試這樣做,或者確保使用適當的JSNI表示法引用該媒體資源,請參閱http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields – 2012-02-29 20:54:27

回答

1

現在我找到了一種方法來做到這一點。我的結論是,本機代碼和普通JavaScript的處理方式有所不同,這取決於導出的類不在當前範圍內,需要由$wnd作爲前綴。

下面是我如何將我的JavaScriptObject轉換爲導出的類Icon。這有點尷尬,但它的工作原理並不取決於實施細節。

public class ConvertUtils implements Exportable { 

    private static Icon icon_; 

    public static Icon icon(JavaScriptObject obj) { 
     icon_ = null; 
     setIconNative(obj); 
     return icon_; 
    } 

    private static native void setIconNative(JavaScriptObject obj) /*-{ 
     $wnd.ravegeo.ConvertUtils.setIcon(obj); 
    }-*/; 

    @Export 
    public static void setIcon(Icon icon) { 
     icon_ = icon; 
    } 
} 

訣竅是通過導出的方法將對象轉換爲解包(setIcon方法)。