java反射(10) 使用反射获取泛型信息

  1. 前面说活可以通过Class对象可以获得成员变量的类型,不管该成员变量是不是私有的,但是如果成员变量是有泛型类型的参数的话,如Map<String, Integert>那么将无法获得其泛型参数的信息。
  2. 想要获得泛型参数的信息应该使用以下步骤:
    1. 将Type对象强制转换成ParameterizedType对象
    2. ParameterizedType类提供了getRawType()方法,可以返回没有泛型信息的原始类型
    3. 还有一个getActualTypeArguments()方法,这个方法可以返回泛型参数的数据类型
  3. 以下为代码,具体讲解穿插在代码中
    package Chapter_6;
    
    
    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.Map;
    
    public class GenericTest {
        private Map<String, Integer> score;
        public static void main(String args[]) throws  Exception{
            Class<GenericTest> clazz = GenericTest.class;
    
            Field field = clazz.getDeclaredField("score");
    //        通过getDeclaredField可以获得成员变量,但是对于Map来说,仅仅可以知道它是个Map,无法知道键值对各自的数据类型
    
            Class<?> a = field.getType();
    //        获得field的数据类型,是Map
    
            System.out.println("score的类型是" + a);
    
    
            Type gType = field.getGenericType();
    //        获得field的泛型类型
    
    //        如果gType是ParameterizedType对象(参数化)
            if(gType instanceof ParameterizedType){
    
                ParameterizedType pType = (ParameterizedType)gType;
    //            就把它转换成ParameterizedType对象
    
                Type rType = pType.getRawType();
    //            获得原始数据类型
    
                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("出错!!!");
            }
    
        }
    }
    //运行程序,看到以下输出:
    //        score的类型是interface java.util.Map
    //        泛型的类型是:
    //        第0个泛型类型是: class java.lang.String
    //        第1个泛型类型是: class java.lang.Integer

     

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页