【Java基础】Java中如何获取⼀个类中泛型的实际类型
泛型的术语
<>: 念做typeof
List<E>: E称为类型参数变量
ArrayList<Integer>: Integer称为实际类型参数
ArrayList<Integer>: 整个ArrayList<Integer>称为参数化类型(对应着flect.ParameterizedType接⼝)
泛型反射相关API
Type[] getGenericInterfaces():获得当前类实现的泛型接⼝(参数化类型)
举例1:
1)定义类A,C 接⼝B
//类B
public interface B{}
//类C
public class C{}
//A实现B,向B传⼊实际类型参数C
public class A implements B<C>{}
2)测试代码
A a = new A();
Type[] types = a.getClass().getGenericInterfaces();
for (Type type : types) {
System.out.println(type);//结果是:B<C>
}
Type[] getGenericSuperclass():获得带有泛型的⽗类
举例2:
1)定义3个类A,B,C
//类B
public class B{}
//类C
public class C{}
//A继承B,向B传⼊实际类型参数C
public class A extends B<C>{}
2)测试代码
A a = new A();
Type type = a.getClass().getGenericSuperclass();
System.out.println(type);//结果是:B<C>
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<C>
//将type强转成Parameterized
ParameterizedType pt = (ParameterizedType )type;
/*得到⽗类(参数化类型)中的泛型(实际类型参数)的实际类型。
getActualTypeArguments()返回⼀个Type数组,之所以返回Type数组,是因为⼀个类上有可能出现多个泛型,⽐如:Map<Integer,String>
*/
Type [] actualTypes = pt.getActualTypeArguments();
System.out.println(actualTypes[0]);//结果:C
获取接⼝泛型的实际类型参数做法跟上⾯代码差不多,只需要把
Type type = a.getClass().getGenericSuperclass(),改成 Type type = a.getClass().getGenericInterfaces()就可以了。
public BasicAction(){
try {
//获取⼦类字节码⽂件对象,this代表的是⼦类对象。
Class clazz = Class();
//获取⼦类所属接⼝的参数化类型,BasicAction&x.Standard>
Type type = GenericSuperclass();
//因为type是顶级接⼝没有定义任何⽅法,所以需要强转为⼦接⼝ParameterizedTypejava反射获取父类属性
ParameterizedType parameterizedType = (ParameterizedType) type;
//通过⼦接⼝定义的getActualTypeArguments⽅法获取到实际参数类型,&x.Standard> //返回参数为数组,因为Java中接⼝可以多实现
Type[] types = ActualTypeArguments();
//获取数组中的实际参数类型
Class clzz = (Class) types[0];
//通过实际参数类型获取实际参数类型的实例
model = (T) wInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论