泛型 反射 分析

1、

     Type

     它是所有类型的公共接口。包括原始类型、参数化类型、数组类型、类型变量和基本类型。 ParameterizedType, TypeVariable, WildcardType,GenericArrayType 这四个接口都是它的子接口。
     GenericDeclaration
     这个接口 Class Method Constructor 都有实现,我们就是要用这个接口的 getTypeParameters 方法,它返回一个 TypeVariable[] 数组,这个数组里面就是我们定义的类型变量 T K ,顺序与我们声明时一样。如果用循环语句将数组打印出来,你会发现只会输出 T K ,这可不是我们想要的结果,那么想要获得预期的结果怎么办呢?请继续往下看。
     TypeVariable
     它表示类型变量。比如 T ,比如 extends   Comparable<?  super   T> & Serializable ,这个接口里面有个 getBounds () 方法,它用来获得类型变量上限的 Type 数组,如果没有定义上限,则默认设定上限为 Object ,请注意 TypeVariable 是接口,实际得到的是 TypeVariableImpl 实现类,下面几个接口都一样。
     TK来说明,T没有定义任何上限,所以它就有一个默认上限java.lang.Object,实际跟踪代码的时候你会发现Tbounds属性为空,只有在调用了getBounds()方法后,才会有一个Type[1]数组[class java.lang.Object]。而对于K来说,调用了getBounds方法后,得到的数组是[java.lang.Comparable<? super T>, interface java.io.Serializable],它们的类型却是不一样的,第1个是ParameterizedType,而第二个是Class
    ParameterizedType
    ParameterizedType表示参数化类型,就是上面说的java.lang.Comparable<? super T>,再比如List<T>List<String>,这些都叫参数化类型。得到Comparable<? super T>之后,再调用getRawType()getActualTypeArguments()两个方法,就可以得到声明此参数化类型的类(java.lang.Comparable)和实际的类型参数数组([? super T]),而这个? super T又是一个WildcardType类型。
    WildcardType
     它用来描述通配符表达式,上面返回的 ? super T 正好是这个类型。然后调用 getUpperBounds() 上限和 getLowerBounds() 下限这两个方法,获得类型变量 ? 的限定类型 ( 上下限 ) ,对于本例的通配符 (?) ,它的上限为 java.lang.Object ,下限为 T

通过上面几个接口的分析,可以将Person类的泛型参数都解析出来,那么Person的超类以及实现的接口该怎么处理呢?Class类里面同样在1.5版本加入了getGenericSuperclass()getGenericInterfaces()两个方法,用于返回带参数化类型的超类与接口。

2、

TypeVariable     类型变量  如 <T,K>中的T与K,由GenericDeclaration接口方法getTypeParameters()得到TypeVariable[]
ParameterizedType  参数化类型即泛型  如 List<String>   其中 List 为 (type)RawType, String 为 (type[])ActualTypeArguments
WildcardType     通配符表达式类型   如 ? extends T
GenericArrayType  泛型数组
GenericDeclaration 接口,实现者可以声名类型变量进而形成泛型   

猜你喜欢

转载自blog.csdn.net/happyzwh/article/details/79498464