java再複習——通過反射獲取到方法的引數和返回值的泛型型別
阿新 • • 發佈:2019-02-19
我們都知道了可以定義帶有泛型引數的方法,以及泛型返回值的方法了,那麼泛型在執行的時候已經被擦除了,我們該如何知道這個泛型到底是什麼呢?有很多情況需要知道實際泛型是什麼,Android資料庫框架以及Http框架在解析成json成實體類的時候,必然要知道是哪個類。
獲取引數的泛型API方法:
public class GenericParameterizedTypeDemo { public static void main(String[] args) throws Exception { //通過反射獲取到方法 Method declaredMethod = GenericParameterizedTypeDemo.class.getDeclaredMethod("findStr", int.class,Map.class); //獲取到方法的引數列表 Type[] parameterTypes = declaredMethod.getGenericParameterTypes(); for (Type type : parameterTypes) { System.out.println(type); //只有帶泛型的引數才是這種Type,所以得判斷一下 if(type instanceof ParameterizedType){ ParameterizedType parameterizedType = (ParameterizedType) type; //獲取引數的型別 System.out.println(parameterizedType.getRawType()); //獲取引數的泛型列表 Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); for (Type type2 : actualTypeArguments) { System.out.println(type2); } } } } public static List<String> findStr(int id,Map<Integer, String> map){ return null; } }
一定是getGenericParameterTypes()方法,getParameterTypes得到的引數列表Type物件時不儲存泛型型別的。
獲取返回值泛型的API方法:
public class GenericParameterizedTypeDemo { public static void main(String[] args) throws Exception { //通過反射獲取到方法 Method declaredMethod = GenericParameterizedTypeDemo.class.getDeclaredMethod("findStr", int.class,Map.class); //獲取返回值的型別,此處不是陣列,請注意智商,返回值只能是一個 Type genericReturnType = declaredMethod.getGenericReturnType(); System.out.println(genericReturnType); //獲取返回值的泛型引數 if(genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType)genericReturnType).getActualTypeArguments(); for (Type type : actualTypeArguments) { System.out.println(type); } } } public static List<String> findStr(int id,Map<Integer, String> map){ return null; } }