歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java使用反射來獲取泛型信息

Java通過指定類對應的Class對象,程序可以獲得該類裡包括的所有Field,不管該Field使用private修飾,還是使用public修飾。獲得了Field對象後,就可以很容易的獲得該Field的數據類型,例如,下面的代碼便是獲得該Field對象foeld的類型:

Class<?> type = field.getType();

但是通過這種方式只對普通類型的Field有效,如果該Field的類型是有泛型限制的類型,如Map<String,Integer>類型,則不能准確得到該Field的泛型參數。

為了獲得指定Field的泛型類型,應該使用如下方法來獲取指定Field的泛型類型:

Type type = field.getGenericType();

然後將Type對象強制類型轉換成ParameterizedType對象,ParameterizedType代表被參數化的類型,也就是增加了泛型限制的類型,ParameterizedType類提供了兩個方法:

getRawType();返回被泛型限制的類型;

getActualTypeArguments();返回泛型參數類型。

下面,我們來看一個完整的例子,方便大家掌握:

  1. import java.lang.reflect.Field;   
  2. import java.lang.reflect.ParameterizedType;   
  3. import java.lang.reflect.Type;   
  4. import java.util.HashMap;   
  5. import java.util.Map;   
  6.   
  7.   
  8. public class GenericTest {   
  9.        
  10.     private Map<String , Integer> map = new HashMap<String, Integer>();   
  11.        
  12.     public static void main(String[] args) throws SecurityException, NoSuchFieldException {   
  13.         // 獲取Class實例   
  14.         Class<GenericTest> class1 = GenericTest.class;   
  15.         // 根據屬性名取得該屬性對應的Field對象   
  16.         Field mapField = class1.getDeclaredField("map");   
  17.         // 示范第一個方法:直接通過getType()取出Field的類型,只對普通類型的Field有效   
  18.         Class<?> class2 = mapField.getType();   
  19.         // 輸出查看   
  20.         System.out.println("屬性名為map的屬性類型為:"+class2);   
  21.            
  22.         // 示范第二種方法:   
  23.         Type mapMainType = mapField.getGenericType();   
  24.         // 為了確保安全轉換,使用instanceof   
  25.         if (mapMainType instanceof ParameterizedType) {   
  26.             // 執行強制類型轉換   
  27.             ParameterizedType parameterizedType = (ParameterizedType)mapMainType;   
  28.             // 獲取基本類型信息,即Map   
  29.             Type basicType = parameterizedType.getRawType();   
  30.             System.out.println("基本類型為:"+basicType);   
  31.             // 獲取泛型類型的泛型參數   
  32.             Type[] types = parameterizedType.getActualTypeArguments();   
  33.             for (int i = 0; i < types.length; i++) {   
  34.                 System.out.println("第"+(i+1)+"個泛型類型是:"+types[i]);   
  35.             }   
  36.         } else {   
  37.             System.out.println("獲取泛型類型出錯!");   
  38.         }   
  39.     }   
  40.        
  41. }  
Copyright © Linux教程網 All Rights Reserved