私はこのようなことをしたい:
List<Animal> animals = new ArrayList<Animal>();
for( Class c: list_of_all_classes_available_to_my_app() )
if (c is Animal)
animals.add( new c() );
そこで、アプリケーションの世界にあるすべてのクラスを調べて、Animal から派生したクラスを見つけたら、そのタイプの新しいオブジェクトを作成してリストに追加したいと考えています。これにより、リストを更新しなくても機能を追加できます。私は次のことを避けることができます:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
上記のアプローチでは、Animal を拡張する新しいクラスを作成するだけで、自動的に取得されます。
更新: 2008 年 10 月 16 日午前 9:00 太平洋標準時:
この質問に対して多くの素晴らしい回答が寄せられました -- ありがとうございます。 回答と私の調査から、私が本当にやりたいことは Java では不可能であることがわかりました。機能する ddimitrov の ServiceLoader メカニズムなどのアプローチがありますが、それらは私が望むものに対して非常に重く、Java コードから外部構成ファイルに問題を移すだけだと思います。 2019 年 5 月 10 日更新(11 年後!) @IvanNik の回答 org.reflectionsによると、これに役立つライブラリがいくつかあります。@Luke Hutchisonの答えからのClassGraphも面白そうです。答えにはさらにいくつかの可能性があります。
私が望むことを述べるもう 1 つの方法: Animal クラスの静的関数は、Animal から継承するすべてのクラスを見つけてインスタンス化します。それ以上の構成やコーディングは必要ありません。構成する必要がある場合は、とにかく Animal クラスでそれらをインスタンス化することもできます。Java プログラムは .class ファイルの緩い連合にすぎないため、それがまさにその通りであることは理解しています。
興味深いことに、これはC# ではかなり些細なことのようです。