1.学习之前我们先来了解一些泛型的术语<>: 念做typeofList: E称为类型参数变量ArrayList: Integer称为实际类型参数ArrayList: 整个ArrayList称为参数化类型(对应着java.lang.reflect.ParameterizedType接口)

2.泛型反射相关APIType[] getGenericInterfaces():获得当前类实现的泛型接口(参数化类型)举例1:1)定义类A,C 接口B

//类Bpublic interface B{}//类Cpublic class C{}//A实现B,向B传入实际类型参数Cpublic class A implements B{}

2)测试代码

A a = new A();Type[] types = a.getClass().getGenericInterfaces();for (Type type : types) {

System.out.println(type);//结果是:B}

Type[] getGenericSuperclass():获得带有泛型的父类举例2:1)定义3个类A,B,C

//类Bpublic class B{}//类Cpublic class C{}//A继承B,向B传入实际类型参数Cpublic class A extends B{}

2)测试代码

A a = new A();Type type = a.getClass().getGenericSuperclass();System.out.println(type);//结果是:B

ParameterizedType:参数化类型接口,Type的子接口通过上面两个案例可知getGenericInterfaces和getGenericSuperclass可以获取到参数化类型B,并且ParameterizedType是Type的子接口,将Type强转成ParameterizedType。ParameterizedType提供了一个getActualTypeArguments()方法,这个方法可以获取参数化类型中的实际类型参数。举例3:我们对案例2测试代码进行修改

A a = new A();//获得带有泛型的父类Type type = a.getClass().getGenericSuperclass();System.out.println(type);//结果是:B//将type强转成ParameterizedParameterizedType pt = (ParameterizedType )type;/*得到父类(参数化类型)中的泛型(实际类型参数)的实际类型。getActualTypeArguments()返回一个Type数组,之所以返回Type数组,是因为一个类上有可能出现多个泛型,比如:Map*/Type [] actualTypes = pt.getActualTypeArguments();System.out.println(actualTypes[0]);//结果:C

获取接口泛型的实际类型参数做法跟上面代码差不多,只需要把Type type = a.getClass().getGenericSuperclass(),改成Type type = a.getClass().getGenericInterfaces()就可以了。

讲解完毕,如有错漏请多多包含!!!!!