別の回答で述べたように、これは純粋なリフレクションでは不可能です。
このケースを具体的に処理するためにクラスをカスタマイズできない場合は、クラスローダーからクラスを反復処理するか、後で要求されたときに情報を内部データ構造に追加するカスタムクラスローダーを使用する必要があります。すべてのクラスで繰り返す必要はありません。
クラスローダーコードに飛び込むことに興味がないと仮定すると (興味がないように思えます)、これを行うための次善の方法は、クラスの読み込み時に実行される静的コードをクラスに追加することです。例えば:
public class Animal {
protected static List subclasses = new ArrayList();
//...
}
public class Cat extends Animal {
static {
subclasses.add(Cat.class);
}
//...
}
これは基本的にカスタム クラス ローダーで行うことであり、このコードはクラスではなくクラス ローダーに存在します。
すべてのサブクラスに対してこのパターンを繰り返します。次に、インスタンスを作成する場合は、subclasses
リスト内にクラス参照があり、これを使用してインスタンス化しますClass.newInstance
(または、コンストラクターに引数がある場合は別の適切なリフレクション メソッド)。