getinterfaces()只返回类直接实现的接口数组,getsuperclass()只返回直接继承的父类class对象;二者均不递归查找,接口调用getinterfaces()返回其直接继承的父接口。

Java 反射中,getInterfaces() 和 getSuperclass() 是获取类继承结构最基础、最直接的两个方法。它们分别负责抓取“实现了哪些接口”和“继承自哪个父类”,但都只返回**直接关系**,不递归向上查找。
getSuperclass():只拿一级父类
该方法返回当前类**直接继承的父类**的 Class 对象,返回类型是 Class>(不是数组,因为 Java 是单继承)。如果当前类是 Object 或是接口,则返回 null。
-
示例:若
Dog extends Animal,则Dog.class.getSuperclass()返回Animal.class -
注意:它不会继续往上找
Animal的父类(比如Living),也不会返回任何接口 -
安全调用:使用前建议判空,避免
NullPointerException
getInterfaces():只列直接 implements 的接口
该方法返回一个 Class[] 数组,包含当前类在 class X implements A, B, C 中**显式声明实现的所有接口**,不包括父类实现的接口,也不包括父接口的父接口。
-
示例:若
Dog implements Movable, Barkable,则结果为{Movable.class, Barkable.class} -
常见误区:
AnimalImpl implements Animal,而Dog extends AnimalImpl—— 此时Dog.class.getInterfaces()返回空数组[],因为Dog没有implements任何接口 -
接口本身也能调用 getInterfaces():比如
Animal extends Living,那么Animal.class.getInterfaces()就会返回{Living.class}
组合使用可还原完整继承链
单独调用这两个方法只能看到“一层”,但把它们串起来,就能逐步展开整个类型结构:
- 先调
clazz.getSuperclass()得到父类,再对父类重复调用,直到返回null - 对每个类(包括自身、父类、所有接口)都调
getInterfaces(),再对每个返回的接口继续调,形成树状遍历 - 实际开发中常配合
Set<class>></class>去重,防止同一接口被多次加入(例如多个父类都实现了Serializable)
快速验证的小技巧
打印当前类的直接继承信息,几行代码就能看清:
Class> cls = Dog.class;
System.out.println("父类:" + Optional.ofNullable(cls.getSuperclass()).map(Class::getName).orElse("null"));
System.out.println("直接实现的接口:" + Arrays.toString(
Arrays.stream(cls.getInterfaces()).map(Class::getSimpleName).toArray()
));
这样输出清晰,适合调试或生成文档。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











