1. 程式人生 > >java再複習——通過反射獲取到方法的引數和返回值的泛型型別

java再複習——通過反射獲取到方法的引數和返回值的泛型型別

我們都知道了可以定義帶有泛型引數的方法,以及泛型返回值的方法了,那麼泛型在執行的時候已經被擦除了,我們該如何知道這個泛型到底是什麼呢?有很多情況需要知道實際泛型是什麼,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;
	}
	
}