通过反射来获取泛型的参数以及返回值(不是很懂)

Posted li33

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过反射来获取泛型的参数以及返回值(不是很懂)相关的知识,希望对你有一定的参考价值。

反射获取泛型有下面的方法
1.从方法中获取泛型参数列表
Type[] genericParameterTypes = method.getGenericParameterTypes ();
2.

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 Test08 {
    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;
    }
    public static void main(String[] args) throws NoSuchMethodException {
        //首先获取test01方法
        Method method = Test08.class.getMethod ("test01",Map.class,List.class);
        //将方法的泛型参数类型存储在Type类型数组,type类型可以存储所有的java类型
        Type[] genericParameterTypes = method.getGenericParameterTypes ();
        for (Type genericParameterType : genericParameterTypes) {
            //获取泛型及其中参数
            System.out.println ("##"+genericParameterType);
            //
            if(genericParameterType instanceof ParameterizedType){
                Type[] actuallyTypeArguments = ((ParameterizedType)genericParameterType).getActualTypeArguments();
                for (Type actuallyTypeArgument : actuallyTypeArguments) {
                    System.out.println (actuallyTypeArgument);
                }
            }
        }
        System.out.println ("--------------------------------");
        method = Test08.class.getMethod ("test02",null);
        Type genericReturnType = method.getGenericReturnType ();
        if(genericReturnType instanceof ParameterizedType){
            Type[] actuallyTypeArguments = ((ParameterizedType)genericReturnType).getActualTypeArguments();
            for (Type actuallyTypeArgument : actuallyTypeArguments) {
                System.out.println (actuallyTypeArgument);
            }
        }

    }
}
结果:
##java.util.Map<java.lang.String, Reflection.User>
class java.lang.String
class Reflection.User
##java.util.List<Reflection.User>
class Reflection.User
--------------------------------
class java.lang.String
class Reflection.User

以上是关于通过反射来获取泛型的参数以及返回值(不是很懂)的主要内容,如果未能解决你的问题,请参考以下文章

《Java架构筑基》从Java基础讲起——泛型与反射

如何反射获取List<T> 中泛型的类型

java反射获得泛型参数getGenericSuperclass():获取到父类泛型的类型

如何在运行时获取泛型的类型

泛型反射和异常

JAVA反射问题,一个方法类的参数能否通过设置成泛型或者啥来接收反射的CLASS。