繁体   English   中英

Java 反射得到超类得到了意想不到的结果

[英]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()方法的,为什么这个方法没有返回与其名称对应的结果?

CloseableAutoCloseable都不是类,它们都是接口。

getSuperclass只返回超类,而不是超接口。 如果调用不是 class 本身的东西(例如接口或原始类型),则该方法返回null

您可能想改为调用getInterfaces

Closeable是一个接口,它没有超类,只有超接口。

正如它getSuperclass()的文档中所说:

如果此 Class 表示 Object class、接口、原始类型或 void,则返回 Z37A6259CC64C1DAE299D8。

Closeable closeable = () -> {

};

正在有效地创建实现CloseableCloseable有一个抽象方法close() ,您正在用一个空主体来实现它。 这实际上与编写相同:

Closeable closeable = new Closeable() {
  @Override public void close() {}
}

这个 class确实有一个超类,因为除了Object之外的所有类都有一个超类。 根据规范,该超类是Object

如果ClassOrInterfaceTypeToInstantiate中的Identifier表示接口I ,则声明实现IObject的匿名直接子类。

该方法getSuperClass说:

返回表示由此 Class 表示的实体(类、接口、原始类型或 void)的超类的 Class。

在您的情况下,超级class是 Object。 因为您正在查看 class 实例。

含义:在第二个示例中,您创建了一个 lambda,基本上:一个匿名内部class

要收集有关已实现(或扩展)接口的信息,请使用getInterfaces

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM