2011-02-11 51 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);