class.getinterfaces()只返回当前类直接implements的接口,不包含父类或父接口继承的接口;需手动递归遍历继承树才能获取全部可达接口。

<p>Java 中 <strong>Class.getInterfaces()</strong> 方法可以直接返回当前类显式实现的所有接口的 <code>Class[]</code> 数组,但要注意:它**只返回当前类直接 implements 的接口,不包含父类实现的接口,也不递归查找继承链中的接口**。</p> <h3>只返回直接实现的接口</h3> <p>该方法不会向上追溯父类或父接口所实现的接口。例如:</p>
- 若
class A implements I1, I2,则A.class.getInterfaces()返回[I1.class, I2.class]; - 若
class B extends A(未额外 implements 接口),则B.class.getInterfaces()返回空数组[],即使 A 实现了接口; - 若
interface I3 extends I1, I2,且class C implements I3,则C.class.getInterfaces()只返回[I3.class],不是[I1.class, I2.class, I3.class]。
获取所有“可达”接口(含继承链)需手动递归
如需获得包括父类、父接口间接实现的全部接口,必须自己遍历类继承树和接口继承树。常用做法是:
- 收集当前类直接实现的接口;
- 对每个接口,递归调用其
getInterfaces()获取父接口; - 对当前类的父类(
getSuperclass()),重复调用其getInterfaces()(注意:父类可能也 implements 接口); - 用
Set<Class>去重,避免重复接口(如多个路径到达同一接口)。
简单示例:获取直接接口
代码片段:
<code>Class<?> clazz = ArrayList.class;
Class<?>[] interfaces = clazz.getInterfaces();
for (Class<?> intf : interfaces) {
System.out.println(intf.getSimpleName()); // 输出:List, RandomAccess, Cloneable, Serializable
}</code>
注意:ArrayList 直接 implements 这四个接口,所以全部被返回 —— 这里 List 是接口,RandomAccess 等也是接口,它们都属于 ArrayList 的 implements 列表。
注意事项
该方法对原始类型(如 int.class)、数组类型(如 String[].class)、注解类型等返回空数组;对接口类型自身调用时,返回其直接继承的父接口(即 interface I2 extends I1,则 I2.class.getInterfaces() 返回 [I1.class]);对 Object.class 调用返回空数组,因为 Object 不实现任何接口。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











