在Java中访问父类的每个子类

时间:2010-04-23 00:00:16

标签: java reflection

我必须实现一个给定子类的逻辑,我需要访问它的父类和该父类的所有其他子类(如果有的话)。我没有在Java Reflection中找到任何允许我们访问父类的所有子类的API。有没有办法做到这一点?

例如:

class B extends class A
class C extends class A

现在使用B类,我可以通过调用getSuperClass()找到超类。但是,有了父类,即B类和C类

,有没有办法找到所有的子类

3 个答案:

答案 0 :(得分:12)

如果这不是作业(可能不允许第三方图书馆),我会建议Google Reflections'Reflections#getSubTypesOf()

Set<Class<? extends A>> subTypes = reflections.getSubTypesOf(A.class);

您可以自己扫描类路径,从ClassLoader#getResources()开始,将""作为名称传递给您。

答案 1 :(得分:5)

你是对的:没有直接的API。我想你可以扫描所有加载的类,看看它们是否是给定类的子类。

一个问题:您只能找到已加载的类。这些方法都不会找到尚未加载的类。

答案 2 :(得分:-1)

您可以使用:

thisObj.getClass().getSuperclass()
thisObj.getClass().getInterfaces()
thisObj.getClass().getGenericInterfaces()
thisObj.getClass().getGenericSuperclass()

我最近编写了一些东西来扫描一个类的成员,如果那些是非原始的,也可以扫描它们。但是,我没有向上走,所以我没有使用上述方法,但我相信他们应该做你想做的。

编辑: 我用以下方法进行了一个简单的测试:

public class CheckMe {
  public CheckMe() {
  }
}

public class CheckMeToo extends CheckMe {
  public CheckMeToo() {
  }
}
// In main
System.out.println( CheckMeToo.class.getSuperclass() );

// Output
class CheckMe

之后,这是编码遍历的问题。如果它的参数化,那么事情可能会变得有点复杂但仍然非常可行。

编辑:抱歉没有仔细阅读,让我进一步了解它。

编辑:如果没有扫描CLASSPATH中的所有内容并检查以确保某个对象是某个类的实例,似乎没有任何方法可以执行此操作。