java reflection constructor

java - ¿Cuál es la diferencia entre getDeclaredConstructors y getConstructors en Class API?



reflection (4)

El método ''getDeclaredConstructors'' devuelve solo los constructores que están declarados dentro de la clase. El método ''getConstructors'' también devuelve constructores que no están declarados dentro de la clase pero que se heredan de las súper clases.

Entonces depende de lo que vas a hacer. No hay un enfoque correcto, realmente depende si también necesitas super constructores.

Noté que en la API de Reflection de Java hay dos métodos diferentes para invocar constructores: el método getDeclaredConstructors / getConstructors . Aunque los documentos de Java son ligeramente diferentes ( getDeclaredConstructors parece implicar que devuelve TODOS los constructores, en lugar de los públicos), no está claro por qué la API admite explícitamente estos dos métodos diferentes.

Más importante aún, me pregunto: ¿cuándo sería preferible un método a otro si invocamos las clases de forma dinámica? Por ejemplo, ¿cuál es el propósito de acceder a un constructor privado?


Los métodos getDeclaredXX() existen para la manipulación de clases de formas que no necesariamente fueron pensadas por el creador de esas clases. Tenga en cuenta que hay un método getDeclaredMethod() que le permite invocar métodos privados y el método getDeclaredField() que le permite obtener / establecer campos privados.

No estoy del todo seguro sobre los casos de uso "legítimos", pero obviamente son útiles para hacer ciertas cosas. Además, esta familia de métodos solo devuelve cosas específicamente declaradas en la clase, no cosas que existen en la clase debido a la superclase.

Acceder a un constructor privado podría ser útil por las mismas razones, supongo.


Yo uso getDeclaredConstructors para crear una fábrica de clases cuyo constructor sea privado para evitar que los "usuarios" de mi sistema puedan crear estas clases directamente sin usar la fábrica. Encuentro este método bastante útil.


getDeclaredConstructors (cuando quieres todos los constructores)

Devuelve una matriz de objetos de Constructor que refleja todos los constructores declarados por la clase representada por este objeto de Clase. Estos son públicos, protegidos, acceso predeterminado (paquete) y constructores privados.

getConstructors (cuando solo quieres constructores public )

Devuelve una matriz que contiene objetos Constructor que reflejan todos los constructores públicos de la clase representada por este objeto Clase.

Así que, mirando los documentos para ambos, creo que la diferencia es que getConstructors solo devuelve constructores public mientras que getDeclaredConstructors devuelve todos los constructores ( public , protected , acceso predeterminado (paquete) y private )

Por lo tanto, es fácil si solo necesita los constructores public luego usa getConstructors . De lo contrario, si necesita todos los constructores (sin tener en cuenta el modificador de acceso del constructor), utilice getDeclaredConstructors .