Java通过反射获取泛型信息
利用反射来获取泛型的类型(泛型信息)
步骤:
1.获取当前类
2.获取目标字段
3.获取包含泛型类型的类型getGenericType()
4.强转至子类ParameterizedType因为Type没有任何对应的方法
5.获得泛型真正的类型getActualTypeArguments()
package reflect;
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 Test10 {
public void test1(Map<String,User> map, List<User> list){
System.out.println("test1");
}
public Map<String,User> test2(){
System.out.println("test2");
return null;
}
public static void main(String[] args) throws NoSuchMethodException {
Method method = Test10.class.getDeclaredMethod("test1", Map.class, List.class);
//获取泛型方法参数类型
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
//打印泛型参数类型 java.util.Map<java.lang.String, reflect.User>
System.out.println("#"+genericParameterType);
//如果泛型参数类型属于参数化类型
if (genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();//强转之后获得它真实的泛型参数信息
for (Type actualTypeArgument : actualTypeArguments) {
//打印真实的泛型参数信息
System.out.println(actualTypeArgument);
}
}
}
Method method1 = Test10.class.getDeclaredMethod("test2",null);
//获取泛型方法返回参数类型
Type genericReturnType = method1.getGenericReturnType();
//如果返回泛型参数类型属于参数化类型
if (genericReturnType instanceof ParameterizedType ){
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();//强转之后获得它真实的泛型参数信息
for (Type actualTypeArgument : actualTypeArguments) {
//打印真实的泛型参数信息
System.out.println(actualTypeArgument);
}
}
}
}
运行结果
#java.util.Map<java.lang.String, reflect.User>
class java.lang.String
class reflect.User
#java.util.List<reflect.User>
class reflect.User
class java.lang.String
class reflect.User