一、前言
这里所说的超类(父类)或接口,指的就是某个类继承了一个类或实现了N个接口。
比如ArrayList,它继承了一个类( java. util. AbstractList<E> ),这时候AbstractList就称为ArrayList的超类(父类),并且ArrayList还同时实现了几个接口( java.util.List<E>等 )。
我们可以通过getGenericSuperclass()和getGenericInterfaces()这两个方法来获取超类或接口类的类型;如果超类或接口是泛型的,还可以获取到类型参数的类型。
二、getGenericSuperclass()
这个可以用来获取所继承的超类的类型。返回的Type,表示Class对象对应的实体(类、接口、基元类型或void)的直接超类的Type。
使用方法和打印结果如下:
Type type1 = ArrayList.class.getGenericSuperclass();
System.out.println("ArrayList.class的超类的类型:"+type1.getTypeName());
System.out.println("ArrayList.class的超类的泛型参数类型:"+((ParameterizedType)type1).getActualTypeArguments()[0]); //下标0表示第1个参数,若有多个参数可递增
// 打印结果如下:
// ArrayList.class的超类的类型:java.util.AbstractList<E>
// ArrayList.class的超类的泛型参数类型:E
这个是只能获取直接超类(第一级超类)的类型,如果还需要获取超类的超类的类型,可以加上getSuperclass()。
Type type1 = ArrayList.class.getSuperclass().getGenericSuperclass();
System.out.println("ArrayList.class的超类的超类的类型:"+type2.getTypeName());
System.out.println("ArrayList.class的超类的超类的泛型参数类型:"+((ParameterizedType)type2).getActualTypeArguments()[0]); //下标0表示第1个参数,若有多个参数可递增
// 打印结果如下:
// ArrayList.class的超类的超类的类型:java.util.AbstractCollection<E>
// ArrayList.class的超类的超类的泛型参数类型:E
三、getGenericInterfaces()
这个可以用来获取所实现的接口的类型。返回的Type,表示Class对象对应的类或接口所实现的接口的类型数组(因为JAVA中类可实现/接口可继承N个接口)。
使用方法和打印结果如下:
Type type2 = ArrayList.class.getGenericInterfaces()[0]; //下标0表示所实现接口中的第1个
System.out.println("ArrayList.class实现的第1个接口的类型:"+type2.getTypeName());
System.out.println("返回值type2本身的实际类型:"+type2.getClass());
//实际类型为ParameterizedTypeImpl的,可以强转,继续获取泛型参数的类型;若为java.lang.Class,则表示不是泛型
System.out.println("ArrayList.class实现的第1个接口的泛型参数类型:"+((ParameterizedType)type2).getActualTypeArguments()[0]); // 打印结果如下:
// 打印结果如下:
// ArrayList.class实现的第1个接口的类型:java.util.List<E>
// 返回值Type本身的实际类型:class sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
// ArrayList.class实现的第1个接口的泛型参数类型:E
这个一样只能获取到直接实现的N个接口(第一级接口),如果需要获取所实现接口的所实现接口的类型,就需要将获取到的类型转为Class对象,再重复执行方法。如果是接口类型是泛型的,则不能用getTypeName(),而是需要用getRawType()。
try {Class clazz = Class.forName(((ParameterizedType) type2).getRawType().getTypeName());Type type3 = clazz.getGenericInterfaces()[0];System.out.println("type3="+type3.getTypeName());
} catch (ClassNotFoundException e) {throw new RuntimeException(e);
}
// 打印结果如下:
// type3=java.util.SequencedCollection<E>