我们在项目的BaseDao这个类中经常要用到ParameterizedType这个接口。
先贴一段代码:
public class BaseDao<T> {
// Dbutils中的查询类
private QueryRunner queryRunner = new QueryRunner();
// 用来接收子类的泛型的类型
private Class<T> type;
{
// 子类对象被建立时,会调用父类的构造代码块
// 这里的this指向了子类对象
// 获取子类的Class对象
Class clazz = this.getClass();
// 获取带泛型的父类的ParameterizedType对象
ParameterizedType superclass = (ParameterizedType) clazz.getGenericSuperclass();
// 获取泛型参数数组
Type[] actualTypeArguments = superclass.getActualTypeArguments();
// 该数组的第一个值就是T(也就是子类的Class类型)
type = (Class<T>) actualTypeArguments[0];
}
首先让我们来了解一下Type这个接口。
Type是Java中所有类型的通用超级接口。 这些类型包括基本类型,参数化类型,数组类型,类型变量。
这里的类型其实是某个类的对应的Class名。
如:Integer.class, Double.class, Person.class
public class Main {
public static void main(String[] args) {
Field[] fields = Person.class.getDeclaredFields();
for (Field field : fields) {
if (field.getGenericType() instanceof ParameterizedType) {
ParameterizedType genericType = (ParameterizedType) field.getGenericType();
Type[] arguments = genericType.getActualTypeArguments();
for (Type type : arguments) {
System.out.println(type);
}
}
}
}
}
class Person {
List<Integer> integerList;
List<Double> doubleList;
List<Main> mainList;
}
结果:
java.lang.Integer
java.lang.Double
Main
所以我们只要得到Type对象,就得到了泛型类。
再来看ParameterizedType 接口,它是Type接口的子接口,表示参数化类型。如:List< Integer >; 这个接口中有个方法getActualTypeArguments()它可以获取某个类的所有Type对象(即可以获取某个类的所有泛型)
举个例子:
父类Person的泛型有两个
public class Person<T, E> {
}
我们怎样可以获取父类中的泛型呢?
public class Student extends Person<Student, Integer> {
public static void main(String[] args) {
Class clazz = Student.class;
//获取带泛型的类型
ParameterizedType superclass = (ParameterizedType) clazz.getGenericSuperclass();
Type[] arguments = superclass.getActualTypeArguments();
for (Type argument : arguments) {
System.out.println(argument);
}
}
}
结果:
Student
Integer
获取父类泛型的类型的方式总结:
1.构造子类Class对象
2.获取带泛型的父类的ParameterizedType对象
2.获取父类的Type数组(Type数组中保存了父类的泛型的类型)