Chcę zrobić coś takiego:
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() );
Chcę więc przyjrzeć się wszystkim klasom we wszechświecie mojej aplikacji, a kiedy znajdę taką, która pochodzi od Animal, chcę utworzyć nowy obiekt tego typu i dodać go do listy. Dzięki temu mogę dodawać funkcje bez konieczności aktualizowania listy rzeczy. Mogę uniknąć następujących rzeczy:
List<Animal> animals = new ArrayList<Animal>();
animals.add( new Dog() );
animals.add( new Cat() );
animals.add( new Donkey() );
...
Dzięki powyższemu podejściu mogę po prostu utworzyć nową klasę, która rozszerza Animal i zostanie automatycznie pobrana.
AKTUALIZACJA: 16-10-2008 9:00 czasu pacyficznego:
To pytanie wywołało wiele świetnych odpowiedzi - dziękuję. Z odpowiedzi i moich badań wynika, że to, co naprawdę chcę zrobić, jest po prostu niemożliwe w Javie. Istnieją podejścia, takie jak mechanizm ServiceLoader firmy ddimitrov, który może działać - ale są one bardzo ciężkie dla tego, czego chcę, i uważam, że po prostu przenoszę problem z kodu Java do zewnętrznego pliku konfiguracyjnego. Aktualizacja 10.05.19 (11 lat później!) Istnieje obecnie kilka bibliotek, które mogą pomóc w tym według @ IvanNik za odpowiedź org.reflections wygląda dobrze. Również ClassGraph z @Luke Hutchison za odpowiedź wygląda interesująco. W odpowiedziach jest również kilka innych możliwości.
Innym sposobem określenia tego, czego chcę: funkcja statyczna w mojej klasie Animal wyszukuje i tworzy instancje wszystkich klas, które dziedziczą po Animal - bez dalszej konfiguracji / kodowania. Jeśli muszę skonfigurować, równie dobrze mogę po prostu utworzyć ich instancję w klasie Animal. Rozumiem to, ponieważ program Java to po prostu luźna federacja plików .class, tak właśnie jest.
Co ciekawe, wydaje się, że jest to dość trywialne w C #.