答えは、getClasses
javadocの強調表示されたビットにあります。
この Class オブジェクトによって表されるクラスのメンバーであるすべてのパブリック クラスおよびインターフェイスを表す Class オブジェクトを含む配列を返します。これには、スーパークラスから継承されたパブリック クラスおよびインターフェイス メンバーと、クラスによって宣言されたパブリック クラスおよびインターフェイス メンバーが含まれます。
私が知るgetClasses()
限り、スーパークラスから継承したクラスとそのスーパークラスの静的クラスを返します。インターフェースはスーパークラスではないため、javadoc によると、インターフェースで宣言された静的クラスが返されるとは考えるべきではありません。
次の継承テストのうち、合格するだけtestInheritanceClasses
です。
1) スーパークラスを拡張するクラスは、以下を参照しEnclosed
ます。
public static class RootClass {
public static class Enclosed {}
}
public static class LeafClass extends RootClass {}
@Test
public void testInheritanceClasses() {
Class<?> enclosing = LeafClass.class;
Class<?>[] enclosed = enclosing.getClasses();
System.out.println(Arrays.deepToString(enclosed));
Assert.assertNotEquals(0, enclosed.length);
}
2) インターフェースを「拡張」するインターフェースが見えないEnclosed
public interface Root {
class Enclosed {}
}
public interface Leaf extends Root {}
@Test
public void testInheritanceInterfaces() {
Class<?> enclosing = Leaf.class;
Class<?>[] enclosed = enclosing.getClasses();
System.out.println(Arrays.deepToString(enclosed));
Assert.assertNotEquals(0, enclosed.length);
}
3) インターフェースを実装するクラスは、以下を認識しませんEnclosed
:
public interface Root {
class Enclosed {}
}
public static class LeafImplementingRoot implements Root {}
@Test
public void testInheritanceImplements() {
Class<?> enclosing = LeafImplementingRoot.class;
Class<?>[] enclosed = enclosing.getClasses();
System.out.println(Arrays.deepToString(enclosed));
Assert.assertNotEquals(0, enclosed.length);
}