前面在寫繞過反射對泛型直接賦值的blog中有寫到:泛型在內存中字節碼只有一份,就是編譯完成之後就沒有類型信息了,已經去類型化了。現在我們想想怎麼通過反射來獲取泛型的類型呢?由於已經去類型化了,使用普通的反射根本就獲取不了。
但是可以通過下面的方法可以獲取:
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;
public class GenericAndReflect {
public static void main(String[] args) throws Exception{
Vector<Date> v1 = new Vector();//獲取Vector的Date泛型,通過反射看似根本不可能
Method method =GenericAndReflect.class.getMethod("applyVector", Vector.class);
Type [] types = method.getGenericParameterTypes();//獲取泛型參數類型
ParameterizedType ptype = (ParameterizedType)types[0];// 現在只有一個泛型
System.out.println(ptype.getRawType());//getRawType()獲取自己原始類型
System.out.println(ptype.getActualTypeArguments()[0]);//獲取實際化的類型參數
}
//解決的方法就是創建一個方法,把泛型的類型傳給方法 通過方法來獲取參數列表類型
//因爲Method類中有getGenericParameterTypes()方法,這個方法是按照聲明順序返回 Type 對象的數組,
//這些對象描述了此 Method 對象所表示的方法的形參類型的
//還有一個方法 getParameterTypes()按照聲明順序返回 Class 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型。
public static void applyVector(Vector<Date> v){
}
}