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

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