2011-02-11 47 views
4

我想用GWT中的類對象創建一個具有給定類型的新數組。使用GWT中的類對象創建新數組

我的意思是,我想效仿的

java.lang.reflect.Array.newInstance(Class<?> componentClass, int size) 

我之所以需要這個發生的功能是,我有一個偶爾需要做到以下幾點庫:

Class<?> cls = array.getClass(); 
Class<?> cmp = cls.getComponentType(); 

這個工作如果我通常傳遞一個數組類,但我不能動態地從一些任意組件類型創建一個新的數組。

我很清楚GWT缺乏反思;我明白這一點。然而,即使給予GWT有限的反思,這似乎也是可行的。我相信這是因爲在implementation中,存在無法訪問的用於爲數組創建類對象的靜態方法。

同樣,我理解數組方法只是JavaScript數組的類型安全包裝,因此即使需要JSNI也應該很容易被破解。

在現實中,更重要的是獲得類對象,我可以解決無法創建新的數組。

回答

4

如果您對創建正確類型的種子數組感興趣,可以使用jsni以及超級超級源的一些知識來創建數組,而不通過ArrayList進行復制(我避免了像鼠疫一樣的java.util開銷) :

public static native <T> T[] newArray(T[] seed, int length) 
/*-{ 
return @com.google.gwt.lang.Array::createFrom([Ljava/lang/Object;I)(seed, length); 
}-*/; 

種子哪裏是你想要的正確類型的零長度數組,長度爲你想要的(長度雖然,在生產模式下,陣列真的沒有上限,這使得[ ] .length字段正常工作)。 com.google.gwt.lang包是編譯器中用於基本模擬的一組核心實用程序,可以在gwt-dev!com/google/gwt/dev/jjs/intrinsic/com /谷歌/ GWT /郎。

您只能通過jsni調用使用這些類,並且只能在生產gwt代碼中使用(如果使用GWT.isProdMode())。一般來說,如果您只能訪問超級源代碼中的com.google.gwt.lang類,那麼您絕對不會泄漏對僅存在於編譯的JavaScript中的類的引用。

if (GWT.isProdMode()){ 
    return newArray(seed, length); 
}else{ 
    return Array.newInstance(seed.getComponentType(), length); 
} 

注意,你可能需要超源java.lang.reflect.Array中的類,以避免GWT編譯器錯誤,這表明你希望把你的本地helper方法那裏。但是,我不能幫助你,因爲它會超出我的工作合同範圍。

0

我不得不做類似的事情,我發現有可能使用Guava圖書館的ObjectArrays class。它不需要類對象,而需要對現有數組的引用。

T[] newArray = ObjectArrays.newArray(oldArray, oldArray.length);