java反射:泛型

泛型方法返回类型

如果你获得了java.lang.reflect.Method对象,那么你就可以获取到这个方法的泛型返回类型信息。如果方法是在一个被参数化类型之中(如T test())那么你无法获取他的具体类型,但是如果方法返回一个泛型类(如List test())那么你就可以获得这个泛型类的具体参数化类型。

泛型变量类型

同样可以通过反射来访问公有(Public)变量的泛型类型,无论这个变量是一个类的静态成员变量或是实例成员变量。你可以在“Java Reflection: Fields”中阅读到有关如何获取Field对象的相关内容。这是之前的一个例子,一个定义了一个名为list的成员变量的类。

public class ReflectTModel {

    public List<String> list = new ArrayList<String>();

    public List<String> getList(){
        return list;
    }
}
public class ReflectTDemo {
    public static void main(String [] args) throws Exception {


        try {
            //通过全限定名找到class
            Class t = Class.forName("com.honjane.demo.javademo.ReflectTModel");
            //获得class直接父类类型
            System.out.println(t.getGenericSuperclass());
            //------------------------------------------------------
            //泛型方法返回类型:
            Method method = t.getMethod("getList");
            //目标方法返回类型,(不局限于修饰符)
            Type type = method.getGenericReturnType();

            if(type instanceof ParameterizedType){
                //ParameterizedType 模板参数的类型
                ParameterizedType pType = (ParameterizedType) type;
                System.out.println("method ParameterizedType:"+pType);
               // 返回参数数组
                Type[] types = pType.getActualTypeArguments();

                for (Type typeArgument : types){
                    //参数类型
                    Class _class = (Class)typeArgument;
                    System.out.println("typeArgument:"+_class);
                }
            }
            //------------------------------------------------------
            System.out.println("------------------------------------");
            //泛型属性返回类型:
            Field field = t.getField("list");
            //目标属性的类型,(不局限于修饰符)
            Type gType = field.getGenericType();
            if(gType instanceof ParameterizedType){
                //ParameterizedType 模板参数的类型
                ParameterizedType parameterizedType = (ParameterizedType)gType;
                System.out.println("Field ParameterizedType:"+parameterizedType);
                // 返回参数数组
                Type[] agrTypes = parameterizedType.getActualTypeArguments();
                //运行时类型
                Type agrType1 = parameterizedType.getRawType();
                System.out.println("运行时类型agrType1:"+agrType1);

                for (Type type1: agrTypes){
                    //参数类型
                    Class _class = (Class)type1;
                    System.out.println("agrType:"+_class);
                }
            }

        }catch (Exception e){

        }
    }
}

结果:

class java.lang.Object
method ParameterizedType:java.util.List<java.lang.String>
typeArgument:class java.lang.String
------------------------------------
Field ParameterizedType:java.util.List<java.lang.String>
运行时类型agrType1:interface java.util.List
agrType:class java.lang.String
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值