【问题标题】:Reflection api - find subclass type反射 api - 查找子类类型
【发布时间】:2011-06-02 06:57:16
【问题描述】:

您好,我正在尝试找出子类,形成一个超类对象。

if Class Super is the super class.
and Class Sub1 and Class Sub2 extends Class Super.(all classes are public)

Lets say I have a object of Super type as
Super superObject = new Sub1();

现在对于 superObject,是否有可能找到 superObject 在 Java 中扩展了哪个子类?

既然“超类不会知道它有任何子类”,你能告诉我我上面的问题是有效,还是我错过了任何基本概念?

提前致谢。

【问题讨论】:

  • 你的意思是从这个超类扩展了哪些子类?
  • 两个子类都继承了超类
  • 我可以看到。但是你应该考虑改写你的问题。这个,“是否有可能在 Java 中找到 superObject 扩展的子类?”,没有任何意义。

标签: java inheritance reflection hierarchy


【解决方案1】:

getClass() 方法将在运行时返回对象的具体类型,而不是引用类型。所以简单地做:

Super superObject = new Sub1();
Class<? extends Super> klass = superObject.getClass();

会给你 Sub1.class 从你的问题中不清楚你想用它做什么。您可以简单地对其调用 getName(),检查您拥有的其他引用是否属于同一类型,等等。

【讨论】:

  • 您能否解释一下为什么需要通用类型Class&lt;?&gt;Class klass = superObject.getClass(); 不行吗?
  • 当然,使用原始类型将始终“工作”来代替参数化类型(除了提供类型安全的意义。)我只是认为使用原始类型很糟糕。它们的存在是为了向后兼容旧代码。
【解决方案2】:

您的问题,“是否有可能在 Java 中找到 superObject 扩展的哪个子类?”,没有任何意义。

无论如何,我认为您正在寻找 Class.isAssignableFrom() 可能会在这方面有所帮助。

用法:

superClass.isAssignableFrom(subClass);

文档:

确定类或接口 由这个 Class 对象表示的是 要么相同,要么是超类 或超接口,类或 由指定表示的接口 类参数。

Reference

【讨论】:

    【解决方案3】:

    你想要这个方法:

    boolean isList = Subclass.isAssignableFrom(Superclass);
    

    来自 JavaDoc:

    确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回 false。

    参考:

     Class.isAssignableFrom(Class)
    

    【讨论】:

    • 反过来,superClass.isAssignableFrom(subClass)。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多