Java采用泛型擦除的机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据 的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除 为了通过反射操作这些类型,Java新增了ParameterizedType, GenericArrayType, TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原 始类型齐名的类型. ParameterizedType:表示一种参数化类型,比如Collection<String> GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型 TypeVariable:是各种类型变量的公共父接口 WildcardType:代表一种通配符类型表达式 代码示例 package annotate; import java.lang.reflect.InvocationTargetException; 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 Test12 { public static void main(String[] args) throws Exception { //通过泛型获取方法 通过方法获得泛型的参数化泛型,获取返回值的泛型 Method method = Test12.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 actualTypeArgument : actualTypeArguments) { System.out.println(actualTypeArgument); } } } method = Test12.class.getMethod("test02"); Type genericReturnType = method.getGenericReturnType(); if (genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) { System.out.println(actualTypeArgument); } } } 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; } }
10-07
880
