ResolvableType,可解决的数据类型。它为java语言中的所有类型提供了相同的数据结构,其内部封装了一个java.lang.reflect.Type类型的对象。

在讲解这个数据结构之前,首先要了解一些预备知识,我们不妨思考如下2个问题:

  1. 在java语法中,哪些元素可以代表一种类型?
  2. 在java语法中,哪些元素具有类型?

在jdk中,Type接口代表一种类型,所有的具体类型都需要实现这个接口。

从图中可以看出,java语法中的类型可以分为五大类:组件类型为参数化类型或类型变量的数组、参数化类型、通配符表达式类型、类型变量以及所有定义的Class(每个类都是一个具体的类型)。除Class类以外的4个接口是jdk1.5以后出现的,因为单纯的Class类无法描述泛型信息。

public class TypeDemo<T> {

    // GenericArrayType:组件类型为类型变量的数组
public T[] a;
// GenericArrayType:组件类型为参数化类型的数组
public List<?>[] b;
// ParameterizedType:参数化类型
// List<? extends Object>携带的"? extends Object"
// 即通配符表达式,也就是WildcardType
public List<? extends Object> c;
// Class:普通类型
public List d;
// 类型变量
public T e; public static void wildcardType() throws Exception{
Field field = TypeDemo.class.getDeclaredField("c");
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
for (Type actualTypeArg : actualTypeArguments)
System.out.println(actualTypeArg.getClass());
}
} }

回到之前提到的两个问题,现在第一个问题已经得到了答案。那么,java中哪些元素具有类型的属性呢?答案是:只有变量(或者说值,因为变量是值的载体)才具有类型。那么什么是变量呢?变量根据其所在位置不同,包括:成员变量、局部变量、方法形参以及方法返回值。

之所以用不小的篇幅介绍这两个概念,是希望读者清楚:Class是一种类型,但它本身不具有类型的属性。

言归正传,下面讲解ResolvableType。ResolvableType为所有的java类型提供了统一的数据结构以及API,换句话说,一个ResolvableType对象就对应着一种java类型。我们可以通过ResolvableType对象获取类型携带的信息(举例如下):

  1. getSuperType():获取直接父类型
  2. getInterfaces():获取接口类型
  3. getGeneric(int...):获取类型携带的泛型类型
  4. resolve():Type对象到Class对象的转换

另外,ResolvableType的构造方法全部为私有的,我们不能直接new,只能使用其提供的静态方法进行类型获取:

  1. forField(Field):获取指定字段的类型
  2. forMethodParameter(Method, int):获取指定方法的指定形参的类型
  3. forMethodReturnType(Method):获取指定方法的返回值的类型
  4. forClass(Class):直接封装指定的类型

最后,总结一下ResolvableType的使用场景。它的使用场景是非常广泛的,在spring框架中需要反射的时候,为了不丢失泛型信息,通常都会使用ResolvableType封装所有的类型。

转自:https://my.oschina.net/lixin91/blog/677109

最新文章

  1. vuejs的动态过滤
  2. POJ 2823 Sliding Window + 单调队列
  3. 三大UML建模工具Visio、Rational Rose、PowerDesign的区别
  4. android-数据存储之远程服务器存储
  5. Python OpenCV —— Arithmetic
  6. 学习之路三十九:新手学习 - Windows API
  7. python 新时代
  8. nginx轮询配置详解
  9. 通过url给action传中文参数乱码解决方案
  10. JavaScript之call()和apply()方法详解
  11. GitHub 使用教程图文详解
  12. MPP架构海量数据分析仓库——Greenplum介绍
  13. 安卓GridView奇偶行不同颜色
  14. Node.js的缺陷
  15. Jmeter安装与实例
  16. 服务注册发现consul之一:consul介绍、安装、及功能介绍
  17. Java11-java基础语法(十)类设计综合案例
  18. 2018.07.31 bzoj4569: [Scoi2016]萌萌哒(并查集+倍增)
  19. FindBugs——帮助查找隐藏的bug
  20. MyEclipse6.5注册

热门文章

  1. 与Python的第一次见面
  2. 标准模板库中的向量(vector)
  3. 【拒绝挂分】盘点蒟蒻ghy的各种sb错误
  4. Day3-P - Matrix POJ3685
  5. css 文本溢出省略号
  6. Hive的原生部署方式
  7. 今日份学习: Spring中使用AOP并实现redis缓存?
  8. 01.DesignParttern设计模式,简单工厂,工厂方法,抽象工厂三大工厂的区别与联系
  9. memset函数总结
  10. HiBench成长笔记——(9) Centos安装Maven