使用java的getClasses()方法

时间:2012-11-28 23:48:39

标签: java reflection

我正在寻找有关getClasses()如何工作的一些说明。我正在尝试编写代码,给定一个String类名,找到扩展classname指定的类的所有类。我有一个名为getChildren()的方法来执行此操作。不幸的是,每次调用它时,该方法都会返回一个空集合。这是我的代码。

import java.util.ArrayList;
import java.util.Collection;

public class ClassFinder {

private Class<?> myClass;

public ClassFinder(Class<?> clazz) {
    myClass = clazz;
}

public ClassFinder (String className) throws ClassNotFoundException {
    myClass = Class.forName(className);
}

public Collection<Class<?>> getChildren() {
    Collection<Class<?>> children = new ArrayList<Class<?>>();
    Class<?>[] relatedClasses = myClass.getClasses();
    for (Class<?> potentialChild : relatedClasses) {
        if (potentialChild.isAssignableFrom(myClass)) {
            children.add(potentialChild);
        }
    }
    return children;
} 


}

3 个答案:

答案 0 :(得分:5)

getClasses返回当前类中包含的类。您想要找到从当前类继承的类。遗憾的是,Java API中没有允许您执行此操作的方法。

您可以查看已加载的类:How can I list all classes loaded in a specific class loader

答案 1 :(得分:0)

如果您阅读了getClasses() ...

的文档
  

返回一个包含Class对象的数组,这些对象表示作为此Class对象所代表的类的成员的所有公共类和接口。

关键字:&#34;是会员&#34; - 不是扩展此类的类。此方法将为您提供inner classes,而不是child classes

运行此示例:

public class Example {

    public static void main(String[] argv) {
        for(Class c:Example.class.getClasses()) {
            System.out.println(c.getName());
        }
    }

    public class InnerClass {

    }

}

您将获得此输出:

Example$InnerClass

答案 2 :(得分:0)

您可以做的是创建您自己的类加载器并使用它来加载类,在该类加载器中,您可以保留已加载的所有类的列表

然后,每当您需要查找扩展给定类的类数时,您可以遍历列表中的所有类并使用此类getSuperclass()的此方法来确定此方法返回的值是否相同作为你想要找到孩子的班级。

但是这段代码有一个限制,它可能无法返回您期望的所有类。这是因为在执行代码时,可能没有加载扩展给定类的所有类。