使用反射来获取泛型信息

通过指定类对应的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]);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值