que quiero hacer algo como esto:En tiempo de ejecución, se encuentran todas las clases en una aplicación Java que se extienden una clase base
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());
lo tanto, quiero mirar a todas las clases en el universo de mi solicitud, y cuando encuentro uno que desciende de Animal, quiero crear un nuevo objeto de ese tipo y agregarlo a la lista. Esto me permite agregar funcionalidad sin tener que actualizar una lista de cosas. Puedo evitar lo siguiente:
List<Animal> animals = new ArrayList<Animal>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Donkey());
...
Con el enfoque anterior, simplemente puede crear una nueva clase de animal que se extiende y va a ser recogido de forma automática.
ACTUALIZACIÓN: 10/16/2008 9 a.m. hora estándar del Pacífico:
Esta cuestión ha generado una gran cantidad de grandes respuestas - gracias. A partir de las respuestas y mi investigación, descubrí que lo que realmente quiero hacer simplemente no es posible en Java. Existen enfoques, como el mecanismo ServiceLoader de ddimitrov, que pueden funcionar, pero son muy pesados para lo que yo quiero, y creo que simplemente transfiero el problema del código de Java a un archivo de configuración externo.
Otra forma de expresar lo que quiero: una función estática en mi clase Animal encuentra e instaura todas las clases que heredan de Animal, sin ninguna configuración/codificación adicional. Si tengo que configurar, también podría instanciarlos en la clase Animal de todos modos. Entiendo que debido a que un programa Java es solo una federación suelta de archivos .class, esa es la forma en que es.
Curiosamente, parece que es fairly trivial en C#.
Después de buscar durante un tiempo, parece que esto es una tuerca difícil de descifrar en Java. Aquí hay un hilo que tiene alguna información: http://forums.sun.com/thread.jspa?threadID=341935&start=15 Las implementaciones son más de las que necesito, supongo que me quedaré con el segunda implementación por ahora. – JohnnyLambada
póngalo como respuesta y deje que los lectores lo voten – VonC
El enlace para hacer esto en C# no muestra nada especial. Un ensamblado C# es equivalente al archivo Java JAR. Es una colección de archivos de clase compilados (y recursos). El enlace muestra cómo obtener las clases de un solo ensamblaje. Puedes hacerlo casi tan fácilmente con Java. El problema para usted es que necesita revisar todos los archivos JAR y los verdaderos archivos sueltos (directorios); tendrías que hacer lo mismo con .NET (buscar una RUTA de algún tipo o varios tipos). –