[英]Java reflection gets superclass got unexpected result
在学习 java 反射时,我在测试getSuperclass()
时遇到了一些问题
下面是我的测试代码:
System.out.println(java.io.Closeable.class.getSuperclass());
在我的预期中,这一行应该打印出类似AutoClosable
的内容,因为这是Closable
扩展的 class。 然而,事实证明这是null
。 I tried to explain this as Closable locates in java.io
while AutoClosable locates in java.lang
and getSuperclass()
would only search in the package scope.
但是如果我这样写,这种解释就没有意义了:
Closeable closeable = () -> {
};
System.out.println(closeable.getClass().getSuperclass());
上面的代码导致class java.lang.Object
。 结果使这个问题更加奇特且难以理解。
java 是如何实现这个getSuperclass()
方法的,为什么这个方法没有返回与其名称对应的结果?
Closeable
和AutoCloseable
都不是类,它们都是接口。
getSuperclass
只返回超类,而不是超接口。 如果调用不是 class 本身的东西(例如接口或原始类型),则该方法返回null
。
您可能想改为调用getInterfaces
。
Closeable
是一个接口,它没有超类,只有超接口。
正如它在getSuperclass()
的文档中所说:
如果此 Class 表示 Object class、接口、原始类型或 void,则返回 Z37A6259CC64C1DAE299D8。
Closeable closeable = () -> {
};
正在有效地创建实现Closeable
: Closeable
有一个抽象方法close()
,您正在用一个空主体来实现它。 这实际上与编写相同:
Closeable closeable = new Closeable() {
@Override public void close() {}
}
这个 class确实有一个超类,因为除了Object
之外的所有类都有一个超类。 根据规范,该超类是Object
:
如果
ClassOrInterfaceTypeToInstantiate
中的Identifier
表示接口I
,则声明实现I
的Object
的匿名直接子类。
该方法getSuperClass说:
返回表示由此 Class 表示的实体(类、接口、原始类型或 void)的超类的 Class。
在您的情况下,超级class是 Object。 因为您正在查看 class 实例。
含义:在第二个示例中,您创建了一个 lambda,基本上:一个匿名内部class 。
要收集有关已实现(或扩展)接口的信息,请使用getInterfaces 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.