class.getinterfaces()仅返回类直接实现的接口数组,不包含父类实现的接口或接口的父接口;需递归遍历才能获取所有可达接口。

Java 中可以通过反射的 Class.getInterfaces() 方法获取类直接实现的所有接口,但要注意它只返回**直接实现**的接口,不包括父类实现的接口或接口的父接口。
获取类直接实现的接口
调用 clazz.getInterfaces() 返回的是一个 Class[] 数组,包含该类在 implements 子句中显式声明的所有接口(不包含继承自父类的接口)。
- 仅限当前类
implements的接口,不递归查找父类或父接口 - 返回顺序与源码中声明顺序一致
- 如果类没实现任何接口,返回空数组(不是
null)
示例:
interface A {}
interface B {}
interface C extends A {}
class X implements B, C {}
Class<x> clazz = X.class;
Class>[] interfaces = clazz.getInterfaces(); // [B.class, C.class]
// 注意:A 不会出现在结果中,因为 C 继承 A,但 X 并未直接实现 A</x>
获取类所有可达的接口(含继承链中的)
若需获取类**实际能赋值给的所有接口类型**(即所有可被 instanceof 判断为 true 的接口),需递归收集:
- 当前类直接实现的接口
- 这些接口的父接口(递归)
- 父类实现的接口(向上遍历继承链)
简单实现方式(不含重复处理):
public static Set<class>> getAllInterfaces(Class> clazz) {
Set<class>> result = new LinkedHashSet();
collectInterfaces(clazz, result);
return result;
}
private static void collectInterfaces(Class> clazz, Set<class>> result) {
if (clazz == null || clazz == Object.class) return;
// 当前类直接实现的接口
for (Class> intf : clazz.getInterfaces()) {
if (!result.contains(intf)) {
result.add(intf);
collectInterfaces(intf, result); // 递归收集父接口
}
}
// 递归处理父类
collectInterfaces(clazz.getSuperclass(), result);
}</class></class></class>
注意事项
-
getInterfaces()对interface类型也有效,返回其继承的父接口(如C.class.getInterfaces()返回[A.class]) - 数组不包含
java.io.Serializable、Cloneable等标记接口,除非类显式implements它们 - 泛型接口信息需通过
getGenericInterfaces()获取,getInterfaces()只返回原始类型
快速验证技巧
调试时可直接打印:
Arrays.stream(X.class.getInterfaces())
.map(Class::getName)
.forEach(System.out::println);
或用 IDE 调试器展开 X.class 查看 interfaces 字段(内部字段名可能为 interfaces 或 genericInterfaces,取决于 JVM 实现)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











