美文网首页
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 类型总结

    title: Java Type 总结date: 2022/06/24 16:44 Java 类型总结 Type及...

  • 数组

    Java 中定义数组的语法有两种:type arrayName[];type[] arrayName;type 为...

  • JAVA数组的定义,遍历的方法

    Java 中定义数组的语法有两种: type arrayName[];type[] arrayName; type...

  • java知识总结之Type

    参考 Java中的Type Type是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java中所有...

  • 20170714 TypeAnnotation

    Java8新增的Type Annotation(类型注解) Java8为ElementType枚举增加了TYPE_...

  • Tip | JNI数据类型与指针嵌套

    JNI数据类型 Java Type Java数据类型 Native Type Native层的数据类型 Descr...

  • 我眼中的Java-Type体系(1)

    上一篇,提到了Java泛型的“擦除”;今天,我们说下Java-Type体系; Type是Java 编程语言中所有类...

  • [Effective Java] Item 30: Use en

    在Java 1.5中,有两个类型被加入:enum type和annotation type。 在Java docs...

  • java的Type

    背景:看mybatis源码,看到Reflect类的关于Type的运用,就学习记录一下。 Type一般的出现,都是为...

  • Java Type

    Everything inside a computer is a number. Specifically, t...

网友评论

      本文标题:java的Type

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