美文网首页
java的Type

java的Type

作者: 无聊之园 | 来源:发表于2020-07-29 10:11 被阅读0次

    背景:看mybatis源码,看到Reflect类的关于Type的运用,就学习记录一下。

    Type一般的出现,都是为了读取泛型类型
    一般各种反射类通过getGenericType获得Type类型

    Type有ParameterizedType类型。
    List<T>比如这个类型,获得到的Type就是ParameterizedType。
    常用方法:
    ParameterizedType.getActualTypeArguments():能够获得到泛型的类型,比如这里获得到List<T>里的T,因为泛型可以是数组,比如Map<T, V>,所以ParameterizedType.getActualTypeArguments()返回的是数组Type。

    ParameterizedType.getOwnerType():能获得到所属父类的Type,比如Map.Entity<K, V)调用ParameterizedType.getOwnerType()获得的就是Map的Type

    ParameterizedType.getRawType():获得的是本身的Type,比如List<T>获得的就是List。

    比如fastJson的转换泛型:
    JSON.parseObject(reponse,new TypeReference<HisRetVO<SignNumberRetVO>>() {})

    因为,如果直接传入HisRetVO.Class是读取不到泛型里的类型的,所以传入匿名类TypeReference。
    看TypeReference里的源码,就是通过ParameterizedType.getActualTypeArguments()获取到泛型,然后保存,之后才能知道到底把Json转换成哪种类型。

     protected TypeReference(){
            // 获取父类的泛型Type,这里获得的是TypeReference的Type
            Type superClass = getClass().getGenericSuperclass();
            // 这里通过getActualTypeArguments方法获得TypeReference<T>里面的泛型,这里获得的是HisRetVO<SignNumberRetVO>的type
            Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
            Type cachedType = classTypeCache.get(type);
            if (cachedType == null) {
                classTypeCache.putIfAbsent(type, type);
                cachedType = classTypeCache.get(type);
            }
    
            this.type = cachedType;
        }
    

    Type还有一个类型是GenericArrayType
    比如:T[] List<String>[]这种带泛型的数组。
    常用方法:
    GenericArrayType.getGenericComponentType:能够获得到泛型数组的泛型类型,比如T[]能获得到T的类型,List<String>[]能获得到List<String]类型。
    其他的跟ParameterizedType差不多

    Type还有一种类型是TypeVariable
    比如:T 这种单独泛型的变量。
    t.getBounds(),比如获得到泛型的上限,比如K extends Number 获得到的就是Number

    Type还有一个类型是WildcardType
    这种是泛型的表达式,比如List<? extends Number>、List<? super Number>这种
    WildcardType.getLowerBounds 获得下边界,比如List<? super Number>就能获得Number。
    WildcardType.getUpperBounds 获得上边界,比如List<? extends Number>就能获得上边界Number

    Type还有一个类型就是Class类型
    这个没什么好说的

    其他相关方法:
    Class.getTypeParameters()能获得类上面的定义的泛型,比如class List<T>,List.class.getTypeParameters()能获得T类型。
    Method.getGenericParameterTypes()能获得方法的所有参数类型的Type。

    相关文章

      网友评论

          本文标题:java的Type

          本文链接:https://www.haomeiwen.com/subject/lmxhrktx.html