使用java';s getClasses()方法

使用java';s getClasses()方法,java,reflection,Java,Reflection,我想了解一些关于getClasses()如何工作的说明。我试图编写一段代码,给定一个字符串classname,查找扩展classname指定的类的所有类。我有一个名为getChildren()的方法来实现这一点。不幸的是,每次我调用它时,该方法都返回一个空集合。这是我的密码 import java.util.ArrayList; import java.util.Collection; public class ClassFinder { private Class<?> myC

我想了解一些关于getClasses()如何工作的说明。我试图编写一段代码,给定一个字符串classname,查找扩展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;
} 


}
import java.util.ArrayList;
导入java.util.Collection;
公共类查找器{
私有类myClass;
公共类查找器(类clazz){
myClass=clazz;
}
公共类查找器(字符串className)抛出ClassNotFoundException{
myClass=Class.forName(className);
}
public Collection>children=new ArrayList[]relatedClasses=myClass.getClasses();
for(类潜在儿童:相关类){
if(潜在的child.isAssignableFrom(myClass)){
儿童。添加(潜在儿童);
}
}
返回儿童;
} 
}
返回当前类中包含的类。您希望查找从当前类继承的类。不幸的是,JavaAPI中没有允许您这样做的方法

但是,您可以查看加载的类:

返回当前类中包含的类。您希望查找从当前类继承的类。不幸的是,JavaAPI中没有允许您这样做的方法


但是,您可以查看已加载的类:

如果您阅读了有关

返回一个数组,该数组包含表示所有公共类和接口的类对象,这些类和接口是由该类对象表示的类的成员

关键词:“这些是成员”-而不是扩展此类的类。此方法将为您提供的是,而不是

运行以下示例:

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

如果您阅读了以下文档

返回一个数组,该数组包含表示所有公共类和接口的类对象,这些类和接口是由该类对象表示的类的成员

关键词:“这些是成员”-而不是扩展此类的类。此方法将为您提供的是,而不是

运行以下示例:

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

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

然后,每当您需要查找有多少类扩展了给定的类时,就可以遍历列表中的所有类,并使用class
getSuperclass()
的这个方法来确定这个方法返回的值是否与您试图查找其子类的类相同


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

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

然后,每当您需要查找有多少类扩展了给定的类时,就可以遍历列表中的所有类,并使用class
getSuperclass()
的这个方法来确定这个方法返回的值是否与您试图查找其子类的类相同


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

如果您试图编写某种插件框架,请查看以获得更好的方法来处理此问题。如果您试图编写某种插件框架,请查看以获得更好的方法来处理此问题。