获取运行时泛型的实际类型

用到的就是下面的这条语句

Class clazz = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]

下面通过一个例子来解释这是什么意思

先看父类

public class Father {
	public Father() {
		// 获取父类的Type类型(包括泛型,包名加类名)
		Type type = getClass().getGenericSuperclass();
		System.out.println(type);// 输出 atest.Father
		// Type可以转换成ParameterizedType类型,然后调用getActualTypeArguments类型可以返回泛型数组
		// 由于这里泛型只有1个,所以是0,如果是,那么获取K的类型就是1
		Class clazz = (Class) ((ParameterizedType) type).getActualTypeArguments()[0];
		System.out.println(clazz);//输出class java.lang.Integer
	}
}

再看子类

public class Son extends Father{
	public static void main(String[] args) {
		Son s = new Son();
	}
}
注意:由于创建子类的时候,会先初始化父类,但是此this还是指向子类的,所以在父类中使用getGenericSuperclass()是获取son的父类的类型,如果是new Father(),那么就是获取父类的父类的类型,这时候是会报错的,这点需要注意,在利用spring注入的时候一不小心就会出现错误







你可能感兴趣的:(java,java)