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中,这意味着通过超类关系重用代码,而这在接口中是不会发生的。毕竟,没有多重继承,但可以有多个接口。