0

我正在寻找有关 getClasses() 工作原理的一些说明。我正在尝试编写代码,给定一个字符串类名,查找所有扩展类名指定的类的类。我有一个名为 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;
} 


}
4

3 回答 3

5

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

但是,您可以查看加载的类:如何列出在特定类加载器中加载的所有类

于 2012-11-28T23:53:42.050 回答
0

如果您阅读文档getClasses()...

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

关键字:“即成员”——不是扩展此类的类。此方法将为您提供内部类,而不是子类

运行此示例:

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
于 2012-11-28T23:55:11.703 回答
0

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

然后每当你需要查找有多少类扩展了一个给定的类时,你可以遍历列表中的所有类,并使用 Class 的这个方法getSuperclass()来找出这个方法返回的值是否与你要查找的类相同的孩子。

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

于 2012-11-29T09:08:16.567 回答