Saya ingin melakukan sesuatu seperti ini:
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() );
Jadi, saya ingin melihat semua kelas di alam semesta aplikasi saya, dan ketika saya menemukan satu yang turun dari Animal, saya ingin membuat objek baru dari jenis itu dan menambahkannya ke daftar. Ini memungkinkan saya untuk menambahkan fungsionalitas tanpa harus memperbarui daftar hal-hal. Saya dapat menghindari yang berikut ini:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Dengan pendekatan di atas, saya cukup membuat kelas baru yang memperluas Animal dan itu akan diambil secara otomatis.
UPDATE: 10/16/2008 9:00 pagi Waktu Standar Pasifik:
Pertanyaan ini telah menghasilkan banyak tanggapan hebat - terima kasih. Dari tanggapan dan penelitian saya, saya telah menemukan bahwa apa yang sebenarnya ingin saya lakukan tidak mungkin dilakukan di Jawa. Ada pendekatan, seperti mekanisme ServiceLoader ddimitrov yang dapat bekerja - tetapi mereka sangat berat untuk apa yang saya inginkan, dan saya percaya saya hanya memindahkan masalah dari kode Java ke file konfigurasi eksternal. Perbarui 5/10/19 (11 tahun kemudian!) Sekarang ada beberapa perpustakaan yang dapat membantu dengan ini menurut jawaban @ IvanNik org.refleksi terlihat bagus. Juga ClassGraph dari jawaban @Luke Hutchison terlihat menarik. Ada beberapa kemungkinan lain dalam jawaban juga.
Cara lain untuk menyatakan apa yang saya inginkan: fungsi statis di kelas Animal saya menemukan dan membuat instance semua kelas yang mewarisi dari Animal - tanpa konfigurasi / coding lebih lanjut. Jika saya harus mengkonfigurasi, saya mungkin juga hanya instantiate di kelas Animal saja. Saya mengerti itu karena program Java hanyalah federasi longgar dari file .class yang memang seperti itu.
Menariknya, sepertinya ini cukup sepele di C #.