java反射(10) 使用反射獲取泛型資訊
阿新 • • 發佈:2018-12-12
- 前面說活可以通過Class物件可以獲得成員變數的型別,不管該成員變數是不是私有的,但是如果成員變數是有泛型型別的引數的話,如Map<String, Integert>那麼將無法獲得其泛型引數的資訊。
- 想要獲得泛型引數的資訊應該使用以下步驟:
- 將Type物件強制轉換成ParameterizedType物件
- ParameterizedType類提供了getRawType()方法,可以返回沒有泛型資訊的原始型別
- 還有一個getActualTypeArguments()方法,這個方法可以返回泛型引數的資料型別
- 以下為程式碼,具體講解穿插在程式碼中
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