反射操作泛型
反射操作泛型
-
-
为了通过反射操作这些类型,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型
-
ParameterizedType:表示一种参数化类型,比如Collection
-
GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型
-
TypeVariable:是各种类型变量的公共父接口
-
WildcardType:代表一种通配符类型表达式
package com.hua.reflection; 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 Test11 { public void test01(Mapmap, List list){ System.out.println("test01"); } public Map test02(){ System.out.println("test02"); return null; } /* 先通过Class对象获得方法,然后通过方法获取参数化泛型或者是返回值泛型,再通过泛型来判断是不是参数化类型,如果是的话,强转为参数化类型,再 通过获得真实参数的方法,获得数组将其打印出来 */ public static void main(String[] args) throws NoSuchMethodException { 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 actualTypeArgument : actualTypeArguments) { System.out.println("#"+actualTypeArgument); } } } Method method2 = Test11.class.getMethod("test02", null); Type genericReturnType = method2.getGenericReturnType(); if (genericReturnType instanceof ParameterizedType){ Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments(); for (Type actualTypeArgument : actualTypeArguments) { System.out.println(actualTypeArgument); } } } }