因为类的成员变量在编译时会保留其类型信息的。
如下E是泛型类型,Set e,在类型推导时会替换为Object的,所以你无法获取到类型信息,而e2,定义时就包含了类型信息,故可以获取到。public class TypesTest {
Set e;
Set e2;
}
完整测试代码如下
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class TypesTest {
Map a;
Inner b;
List[][]> c;
List d;
Set e;
Outer.Inner f;
private ParameterizedType mapStringInteger;
private ParameterizedType innerFloatDouble;
private ParameterizedType listSetStringArray;
private ParameterizedType listString;
private ParameterizedType setString;
private ParameterizedType outerInner;
private GenericArrayType setStringArray;
private String toString(ParameterizedType parameterizedType) {
Type[] types = parameterizedType.getActualTypeArguments();
String ret = "\n\t" + parameterizedType + "\n\t\t泛型个数:" + types.length + "==>";
for (Type type : types) {
ret += type + ", ";
}
return ret;
}
@Test
public void main() throws Exception {
mapStringInteger = (ParameterizedType) getClass().getDeclaredField("a").getGenericType();
innerFloatDouble = (ParameterizedType) getClass().getDeclaredField("b").getGenericType();
listSetStringArray = (ParameterizedType) getClass().getDeclaredField("c").getGenericType();
listString = (ParameterizedType) getClass().getDeclaredField("d").getGenericType();
setString = (ParameterizedType) getClass().getDeclaredField("e").getGenericType();
outerInner = (ParameterizedType) getClass().getDeclaredField("f").getGenericType();
setStringArray = (GenericArrayType) listSetStringArray.getActualTypeArguments()[0];
System.out.println("a Map 推导擦除后类型信息:" + toString(mapStringInteger));
System.out.println();
System.out.println("b Inner 推导擦除后类型信息:" + toString(innerFloatDouble));
System.out.println();
System.out.println("c List[][]> 推导擦除后类型信息:" + toString(listSetStringArray));
System.out.println();
System.out.println("d List 推导擦除后类型信息:" + toString(listString));
System.out.println();
System.out.println("e Set 推导擦除后类型信息:" + toString(setString));
System.out.println();
System.out.println("f Outer.Inner 推导擦除后类型信息:" + toString(outerInner));
System.out.println();
System.out.println("c List[][]> List第二层Set的泛型推导信息:" + setStringArray);
}
class Inner {
}
static class Outer {
class Inner {
}
}
}
2012年9月22日 15:04