Java Class.getClasses()不使用从接口继承的类

Java Class.getClasses()不使用从接口继承的类,java,reflection,Java,Reflection,有人能解释为什么test()通过而testInheritance()不通过吗 public class IPanDeviceEnclosedClassesTest { public static interface Root { class Enclosed {} } public static interface Leaf extends Root {} @Test public void testInheritance() {

有人能解释为什么
test()
通过而
testInheritance()
不通过吗

public class IPanDeviceEnclosedClassesTest {

    public static interface Root {
       class Enclosed {}
    }

    public static interface Leaf extends Root {}

    @Test
    public void testInheritance() {
        Class<?> enclosing  = Leaf.class;
        Class<?>[] enclosed = enclosing.getClasses();
        assertNotEquals(0, enclosed.length);
    }

    @Test
    public void test() {
        Class<?> enclosing  = Root.class;
        Class<?>[] enclosed = enclosing.getClasses(); // getDeclaredClasses() works as well
        assertNotEquals(0, enclosed.length);
    }
}
公共类IPandevicenClosedClassestest{
公共静态接口根{
类封闭{}
}
公共静态接口叶扩展根{}
@试验
公开无效证明{
类封闭=Leaf.Class;
类[]封闭=封闭的.getClasses();
assertNotEquals(0,随附长度);
}
@试验
公开无效测试(){
类封闭=Root.Class;
类[]封闭=封闭。getClasses();//getDeclaredClasses()也可以工作
assertNotEquals(0,随附长度);
}
}

答案在于
getClasses

返回一个数组,该数组包含表示所有公共类和接口的类对象,这些类和接口是由该类对象表示的类的成员。这包括从超类继承的公共类和接口成员,以及该类声明的公共类和接口成员

据我所知,
getClasses()
返回从超类继承的类及其超类的静态类。接口不是超类,因此根据javadoc,我们不应该期望返回接口上声明的任何静态类

在以下继承测试中,只有
testInheritanceClasses
通过

1) 扩展超类的类将看到封闭的

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);
}
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);
}
3) 实现接口的类看不到随附的

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);
}
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);
}
公共接口根目录{
类封闭{}
} 
公共静态类LeafImplementingRoot实现根{}
@试验
public void testInheritanceImplements()的{
类封闭=叶实现根.Class;
类[]封闭=封闭的.getClasses();
System.out.println(数组.deepToString(封闭));
Assert.assertNotEquals(0,封闭的.length);
}

请注意,接口是隐式静态的。是否缺少
Root
的括号?@PaulBellora:我知道接口,并且所包含的类是隐式
公共静态的
。这是否会阻止
Class.getClasses()
按照我的要求工作?如果是,为什么@索蒂里奥斯德里曼努利斯:no@AntoineMarques我指的是接口本身,但是是的,你是对的,
封闭的
是隐式公共静态的。这是一个很好的问题。您可能认为声明
Leaf extends Root
意味着
Root
Leaf
的超类,但接口没有超类,至少根据
getSuperclass
。这是有意义的,因为您可以声明
Leaf extends Root、RandomAccess、
etc.+1,下面来验证这一点。不过我会改写这句话:“但它没有从接口继承任何东西。它只是实现了接口。”听起来你是说接口成员不是继承的(他们是继承的)。@PaulBellora谢谢。我会尽量改写,使它更清楚。不幸的是,继承是一个具有重载(:)含义的词。对我来说,在Java中,这意味着通过超类关系重用代码,而这在接口中是不会发生的。毕竟,没有多重继承,但可以有多个接口。