【问题标题】:Why does Class.getSuperclass() sometimes return Object.class?为什么 Class.getSuperclass() 有时会返回 Object.class?
【发布时间】:2013-12-10 09:20:16
【问题描述】:

根据Class.getSuperclass() documentation

返回代表实体超类的类(类, 接口、原始类型或 void)由此类表示。如果这 Class 代表 Object 类、接口、原语 type 或 void,则返回 null。

但我有时会看到 Object.class 被退回(使用 jdk1.7.0_45) - 所以我必须单独检查:

final Class<?> superclass = modelClass.getSuperclass();
if ((superclass != null) && (Object.class != superclass)) {
     // Do stuff with superclasses other than Object.
}

这是一个 Java 错误吗?有没有更好的方法来检查superclass 是否是Object

【问题讨论】:

  • 在您的场景中,一切都是instanceofObject。你想完成什么?
  • 我不会详细介绍,但反射被用于循环遍历类的所有方法,并递归地遍历除 Object 之外的所有祖先。
  • 如果您不详细说明,那么我不确定如何提供帮助。如果我知道你的意图,也许有不同的方式来做你想做的事情。
  • 细节被省略了,因为它与问题无关......

标签: java class object reflection superclass


【解决方案1】:

据我了解,文档中的 this Class 指的是getSuperclass() 方法的调用者。

因此,如果调用者是 Object 类或原始类型/接口,则返回的超类将是 null,这在我看来完全有意义。

【讨论】:

    【解决方案2】:

    文档说如果你的类是java.lang.Object,那么它的getSuperclass 将返回null。换句话说,如果你这样做

    Class objSuper = Object.class.getSuperclass();
    

    那么objSuper 将是null;这正是正在发生的事情 (demo)。

    但是,您的modelClass 似乎不是 java.lang.Object,它也不是原语或接口。因此,返回 java.lang.Object 非常有意义,因为所有类都隐式继承自它。

    【讨论】:

    • 啊,我明白了。现在已将文档的第一句添加到问题中。那句话中提到了两个“类”,我错误地认为第二句话是指第一个而不是第二个。感谢您解决这个问题。
    【解决方案3】:

    如果您需要确定Object 是否是您班级的直接父级,您可以使用

    System.out.println(YourObject.class.getSuperclass() == Object.class);
    

    否则你应该知道最后每个对象都继承Object 类。而不是Object 类本身,所以.getSuperclass() 将返回null

    【讨论】:

    • 谢谢,我正在找这个。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2019-12-26
    • 1970-01-01
    • 2015-09-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多