首页 > 编程语言 > 详细

java - 反射操作泛型

时间:2020-09-16 18:12:20      阅读:49      评论:0      收藏:0      [点我收藏+]

反射操作泛型

  • 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 ===================\n", 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 ================\n", 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

java - 反射操作泛型

原文:https://www.cnblogs.com/icefoxhz/p/13680436.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!