Voglio fare qualcosa del genere:
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() );
Quindi, voglio guardare tutte le classi nell'universo della mia applicazione e quando trovo una che discende da Animal, voglio creare un nuovo oggetto di quel tipo e aggiungerlo all'elenco. Questo mi permette di aggiungere funzionalità senza dover aggiornare un elenco di cose. Posso evitare quanto segue:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Con l'approccio sopra, posso semplicemente creare una nuova classe che estende Animal e verrà raccolto automaticamente.
AGGIORNAMENTO: 16/10/2008 9:00 Pacific Standard Time:
Questa domanda ha generato molte risposte fantastiche - grazie. Dalle risposte e dalle mie ricerche, ho scoperto che ciò che voglio davvero fare non è possibile sotto Java. Ci sono approcci, come il meccanismo ServiceLoader di ddimitrov che può funzionare, ma sono molto pesanti per quello che voglio e credo di spostare semplicemente il problema dal codice Java a un file di configurazione esterno. Aggiornamento 5/10/19 (11 anni dopo!) Ora ci sono diverse librerie che possono aiutarti in questo secondo la risposta di @ IvanNik org.reflections sembra buono. Anche ClassGraph della risposta di @Luke Hutchison sembra interessante. Ci sono anche molte altre possibilità nelle risposte.
Un altro modo per affermare quello che voglio: una funzione statica nella mia classe Animal trova e crea un'istanza di tutte le classi che ereditano da Animal, senza ulteriori configurazioni / codifiche. Se devo configurare, potrei anche semplicemente istanziarli nella classe Animal. Lo capisco perché un programma Java è solo una federazione libera di file .class che è così.
È interessante notare che questo sembra abbastanza banale in C #.