通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰。获得了Field对象后,就可以很容易的获得该Field的数据类型,即使用如下代码即可获得指定Field的类型:
Class<?> a = f.getType();
但通过这种方式只对普通类型的Field有效。但如果该Field的类型是有泛型限制的类型,如Map< String ,Integer>类型,则不能准确得到该Field的泛型参数。
为了获得指定Field的泛型类型,应先使用如下方法来获取指定Field的泛型类型:
Type gType = f.getGenericType();
然后将Type对象强制类型转换为ParameterizedType对象,ParameterizedType代表被参数化的类型,也就是增加了泛型限制的类型。ParameterizedType类提供了两个方法:
-
getRawType():返回被泛型限制的类型。
-
getActualTypeArguments():返回泛型参数类型.
下面是一个获取泛型类型的完整程序。
public class GenericTest{
private Map< String,Integer> score;
public static void main(String[] args) throws Exception{
Class< GenericTest> clazz = GenericTest.class;
Field f = clazz.getDeclaredField("score");
Class<?> a = f.getType();
System.out.println("score的类型是:"+a);
Type gType = f.getGenericType();
if(gType instanceof ParameterizedType){
ParameterizedType pType = (ParameterizedType)gType;
Type rType = pType.getRawType();
System.out.println("原始类型是:"+rType);
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型类型是:");
for(int i = 0;i<tArgs.length;i++){
System.out.println("第"+i+"个泛型类型是:"+tArgs[i]);
}
}else{
System.out.println("获取泛型类型出错!");
}
}
}
获取本类的类泛型
如下程序:
public class A<T> {
public static void main(String[] args) {
//注意这里,如果要获取本类的类泛型,那么不能直接new,这里是创建了一个匿名A类
A<Integer> a = new A<Integer>(){};
Class<?> c = a.getClass();
Type t = c.getGenericSuperclass();//获取父类类型包含泛型参数
System.out.println("A类类型包含泛型参数:"+t);
if(t instanceof ParameterizedType){
ParameterizedType p = (ParameterizedType)t;
System.out.println("A类泛型类型为:"+p.getActualTypeArguments()[0]);
}
}
}