zoukankan      html  css  js  c++  java
  • java

    反射操作泛型

    • Java的泛型采用的是泛型擦除的机制,泛型仅仅是给编译器javac使用的,为了确保数据的安全性和免去强制类型转换的问题,一旦编译完成,所有和泛型有关的类型将全部擦除。
    • 为了通过反射操作这些类型,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的类型但是又和原始类型齐名的类型。
    ParameterizedType	一种参数化类型,比如Collection< String >
    GenericArrayType	一种元素类型是参数化类型或者类型变量的数组类型
    TypeVariable		是各种类型变量的公共父接口
    WildcardType		代表一种通配符类型表达式
    

    获取参数的类型

    Class clz = Class.forName("com.hz.Person");
    Method printCollection = clz.getDeclaredMethod("printCollection", List.class, Map.class);
    Type[] genericParameterTypes = printCollection.getGenericParameterTypes();
    for (Type genericParameterType : genericParameterTypes) {
        System.out.printf("=================== %s ===================
    ", genericParameterType);
        if (genericParameterType instanceof ParameterizedType){
            //获得Map和List中的泛型类型
            Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument.getTypeName());
            }
        }
    }
    
    运行结果:
    =================== java.util.List<java.lang.Integer> ===================
    java.lang.Integer
    =================== java.util.Map<java.lang.Integer, java.lang.String>  ================
    java.lang.Integer
    java.lang.String
    

    获取返回值的类型

    Class clz = Class.forName("com.hz.Person");
    Method printCollection = clz.getDeclaredMethod("printCollection", List.class, Map.class);
    Type genericReturnType = printCollection.getGenericReturnType();
    System.out.printf("=============== %s ================
    ", genericReturnType);
    if (genericReturnType instanceof ParameterizedType){
        Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
        for (Type actualTypeArgument : actualTypeArguments) {
            System.out.println(actualTypeArgument);
        }
    }
    
    运行结果:
    =============== java.util.List<java.lang.String> ================
    class java.lang.String
    
    让火焰净化一切
  • 相关阅读:
    如何保证service不被系统杀死
    查找算法
    java多线程学习
    设计模式-单例
    Python2.7-内置类型
    Python2.7-内置函数
    准备要学的东西
    Python-2.7 : 编码问题及encode与decode
    【JZOJ4637】大鱼海棠【博弈论】
    【JZOJ4637】大鱼海棠【博弈论】
  • 原文地址:https://www.cnblogs.com/icefoxhz/p/13680436.html
Copyright © 2011-2022 走看看