Java的Type接口是Java中所有类型的父亲,所有类型!抄袭一张图片,下图展示了Type的继承结构,下面对每一种类型做详细说明并结合代码的形式。
ParameterizedType:字面意思是参数化类型,感觉不太好理解,其实就是声明时带有泛型的类型,如果还不懂就看下面的例子演示吧
TypeVariable:字面意思"类型变量",其实代表的就是泛型尖括号里的东西,比如List<T>里的T。或者你直接声明一个泛型变量如private T t;
为了方便后面的讲解我先创建一个用于说明的GericObj类
1.获取类的泛型类型
在class类里获取Type接口类型的方法看了下,只有getTypeParameters(),这个方法返回的是TypeVariable<Class>[]数组,表示的是这个类声明的泛型,当前GericObj只声明了一个泛型T所以这个方法返回的数组元素只有一个
2.获取类的属性泛型类型
在GericObj类里我声明了5个属性,带有泛型T的List<T>items,泛型类型是string的names,不带泛型的gericObj,带有泛型的gericObj2和不带泛型的List list ,还有泛型变量T t。使用下面方法测试,只要是带有泛型的不论泛型是指定类型比如指定string类型的names还是未指定确定类型的items或者是gericObj2通过Field的getGenericType()方法获取的类型都是ParameterizedType类型,而不带泛型的List list和gericObj获取到的Type类型是Class类型,而泛型变量T t获取到的是TypeVariable。
对于ParameterizedType对象它有getRawType()方法和getOwnerType()方法,前者获取的是泛型尖括号前面类型,比如List<T>获取的就是List,此时的Type就是class类型,后者获取的是声明的类型,比如这种Map<String,String>.Entry<String,String>这时候获取的就是Map<String,String>
ParameterizedType的getActualTypeArguments()方法是获取泛型参数数组,比如Map<T,E>获取到是Type数组分别是T和E(真实类型是TypeVaible),其getBounds方法返回的是泛型的边界,如果未设置就是Object对象
3.获取类的方法泛型类型
方法类Method的方法跟Type有关的方法有点多分别是获取方法参数泛型类型的getGenericParameterTypes(),获取方法定义上的泛型的getTypeParameters(),和获取方法返回类型的getGenericReturnType(),返回的类型规则与属性的一样这里就不再赘诉了。
GenericArrayType和WildcardType下次来补充吧