前面在写绕过反射对泛型直接赋值的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){
}
}