1. 程式人生 > 其它 >反射操作泛型

反射操作泛型

技術標籤:Java筆記學習反射java泛型

反射操作泛型

  • Java採用泛型擦除的機制來引用泛型,Java中的泛型僅僅是給編譯器Javac使用的,確保資料的安全性和免去強制型別轉換問題,但是,一旦編譯完成,所有和泛型有關的型別全部擦除。
  • 為了通過反射操作這些型別,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType幾種型別來代表不能被歸一到Class類中的型別但是又和原始型別齊名的型別
  • ParameterizedType:表達一種引數化型別,比如 Collection
  • GenericArrayType:表示一種元素型別是引數化型別或者型別變數的陣列型別
  • TypeVariable: 是各種型別變數的公共父介面
  • WildcardType: 代表一種萬用字元型別表示式

案例

package Reflection;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

//通過反射獲取泛型
public class Test10 {

    public void test01(Map<String,
User>
map, List<User> list){ System.out.println("test01"); } public Map<String,User> test02(){ System.out.println(test02()); return null; } public static void main(String[] args) throws NoSuchMethodException { Method method = Test10.
class.getMethod("test01", Map.class, List.class); Type[] genericParameterTypes = method.getGenericParameterTypes(); for (Type genericParameterType : genericParameterTypes) { System.out.println("###"+genericParameterType); if (genericParameterType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments(); for (Type typeArgument : actualTypeArguments) { System.out.println("============"); System.out.println(typeArgument); } } } System.out.println("----------"); method = Test10.class.getMethod("test02"); Type genericReturnType = method.getGenericReturnType(); if (genericReturnType instanceof ParameterizedType) { Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); for (Type typeArgument : actualTypeArguments) { System.out.println("============"); System.out.println(typeArgument); } } } }