概念

  • Java通过泛型擦除机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类型全部擦除
  • 为了通过反射操作这些类型,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型
    • ParameterizedType:表示一种参数化类型,比如Collection<String>
    • GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
    • TypeVariable:是各种类型变量的公共父接口
    • WildcardType:代表一种通配符类型表达式
public class Test11 {
   public static void main(String[] args) throws NoSuchMethodException {
       System.out.println("测试泛型的参数类型==================================================");
       Method method = Test11.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 actualType : actualTypeArguments) {
                   System.out.println(actualType);
               }
           }
       }

       System.out.println("测试泛型的返回值类型==================================================");
       method = Test11.class.getMethod("test02", null);
       Type genericReturnType = method.getGenericReturnType();
       if(genericReturnType instanceof ParameterizedType){  //该泛型是否是参数化类型
           Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();   //获取真实参数信息
           for (Type actualType : actualTypeArguments) {
               System.out.println(actualType);
           }
       }

   }
   public static void test01(Map<String,User> map, List<User> list){
       System.out.println("test01");
   }
   public Map<String,User> test02(){
       System.out.println("test02");
       return null;
   }
}