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
    
    让火焰净化一切
  • 相关阅读:
    Unable To Open Database After ASM Upgrade From Release 11.1 To Release 11.2
    11g Understanding Automatic Diagnostic Repository.
    How to perform Rolling UpgradeDowngrade in 11g ASM
    Oracle 11.2.0.2 Patch 说明
    Pattern Matching Metacharacters For asm_diskstring
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    Upgrading ASM instance from Oracle 10.1 to Oracle 10.2. (Single Instance)
    OCSSD.BIN Process is Running in a NonRAC Environment
    Steps To MigrateMove a Database From NonASM to ASM And ViceVersa
    On RAC, expdp Removes the Service Name [ID 1269319.1]
  • 原文地址:https://www.cnblogs.com/icefoxhz/p/13680436.html
Copyright © 2011-2022 走看看