0

getClasses()がどのように機能するかについての説明を探しています。String 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;
} 


}
4

3 に答える 3

5

getClassesは、現在のクラスで囲まれたクラスを返します。現在のクラスから継承するクラスを検索します。残念ながら、これを可能にするメソッドはJavaAPIにありません。

ただし、ロードされたクラスを確認できます。特定のクラスローダーにロードされたすべてのクラスを一覧表示するにはどうすればよいですか。

于 2012-11-28T23:53:42.050 に答える
0

できることは、独自のクラスローダーを作成し、それを使用してクラスをロードすることです。そのクラスローダーでは、ロードしたすべてのクラスのリストを保持できます。

次に、特定のクラスを拡張するクラスの数を見つける必要があるときはいつでも、リスト内のすべてのクラスを調べ、Classのこのメソッドを使用して、getSuperclass()このメソッドによって返される値が検索しようとしているクラスと同じかどうかを調べることができます。の子。

ただし、このコードには、期待するすべてのクラスを返さない可能性があるという制限があります。これは、コードの実行時に、特定のクラスを拡張するすべてのクラスがロードされていない可能性があるためです。

于 2012-11-29T09:08:16.567 に答える
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 に答える