1. 程式人生 > >java反射(10) 使用反射獲取泛型資訊

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