tipos superclase sencillo poo polimorfismo herencia ejercicios ejemplos ejemplo clase abstracta java reflection runtime

java - superclase - ¿Es posible obtener todas las subclases de una clase?



superclase java (8)

Posible duplicado:
¿Cómo encuentras todas las subclases de una clase dada en Java?

Hola,

Me gustaría obtener una lista de clases que implementan una interfaz en Java en tiempo de ejecución para poder hacer un servicio de búsqueda sin tener que codificarlo. ¿Hay una forma sencilla de hacer esto? No me temo


¿Desea enumerar las clases que implementan una interfaz particular o enumerar las clases que se derivan de alguna clase base? Estos son dos temas diferentes. Por lo que sé, sería difícil de implementar ya que se pueden crear / instalar nuevas implementaciones en una PC en cualquier momento en el futuro. Parece que está intentando crear un método de fábrica para crear una instancia de una instancia en particular y no quiere codificar el nombre de la clase en el código. Usualmente, usar un archivo de configuración que enumera todas las clases que implementan la interfaz es la forma de hacerlo (o se puede usar una base de datos). A medida que las nuevas clases implementan la interfaz, las agrega al archivo de configuración y la fábrica debe elegir el nuevo nombre de la clase.



Estoy tratando de razonar a través de la respuesta aquí, así que probablemente me equivoque. No tendría sentido para una clase tener información sobre sus descendientes o subclases porque en cualquier momento alguien puede crear una nueva subclase de su clase. Entonces tendrías que recompilar tu clase para incluir esta nueva información cada vez. Esto no tiene sentido para el código extensible. Es más probable que una clase contenga información sobre sus antepasados. Por lo tanto, la única solución que puedo ver es que usted repita cada clase en su espacio de problemas y verifique, pero es más que probable que sea una solución horrible para usted.


La única forma en que podría hacerlo es recorriendo la jerarquía de paquetes para los paquetes disponibles en la ruta de clases, verificando cada clase a través de la reflexión (y eso va a ser una mierda porque cargará efectivamente todas las clases, a menos que restrinja su búsqueda a ciertos paquetes ).

El problema con este tipo de comportamiento auto-mágico es que se vuelve difícil cuantificar la aplicación sin ejecutarla, lo que es un dolor de cabeza de mantenimiento. Siempre prefiero ir a la ruta de inyección (a-la Spring) pasando instancias a través de algún tipo de configuración.


La respuesta corta es no.

La respuesta larga es que las subclases pueden existir de muchas maneras, lo que básicamente hace que sea imposible encontrarlas todas categóricamente.

No puedes hacerlo en tiempo de ejecución pero no puedes encontrar clases hasta que estén cargadas y ¿cómo sabes que están cargadas? Puedes escanear cada archivo JAR y clase pero eso no es definitivo. Además, hay cosas como los cargadores de clases de URL.

Las clases internas (estáticas y no estáticas) son otro caso a considerar. Las clases internas nombradas son más fáciles de encontrar. Las clases internas anónimas son potencialmente mucho más difíciles de encontrar.

También debe tener en cuenta que si una clase tiene subclases, se pueden crear nuevas subclases más adelante.


Si solo carga clases desde el disco o desde URL, puede escanear la ruta de clase y encontrar las subclases "manualmente".


Siempre puedo crear una nueva subclase para cualquier clase no final, agregar la subclase a la ruta de clase y anular su intención. La subclasificación es una proposición abierta.

Lo mejor que puedes hacer es decir que para una ruta de clase determinada, sabes cuáles son las subclases, y para hacerlo, deberías escanear cada clase en la ruta de clase.


debe usar Java ServiceLoader que es una clase incorporada. Es capaz de iterar en tiempo de ejecución sobre todas las implementaciones de servicio (interfaz) conocidas.

Si por alguna razón no lo desea, puede usar ClassLoader.getSystemResources () para iterar sobre todos los recursos; por ejemplo, si tiene 6 veces el archivo /META-INF/com.interface, obtendrá 6 iteraciones.