JAVA中获取类的超类(父类)或接口的class类型

一、前言

这里所说的超类(父类)或接口,指的就是某个类继承了一个类或实现了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>

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣广泛的程序猿

有钱的捧个钱场,谢谢各位!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值