歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java使用反射來獲取泛型信息

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

日期:2017/3/1 10:20:19   编辑:Linux編程

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