Je remarque que dans l'API Java Reflection, il existe deux méthodes différentes pour appeler des constructeurs: la méthode getDeclaredConstructors
/getConstructors
. Bien que les documents Java soient légèrement différents (getDeclaredConstructors
semble impliquer qu'il renvoie TOUS les constructeurs, plutôt que les constructeurs publics), il n'est pas clair pourquoi l'API prend explicitement en charge ces deux méthodes différentes.
Plus important encore, je me demande: quand une méthode serait-elle préférable à une autre si nous appelons des classes de manière dynamique? Par exemple, quel est le but d'accéder à un constructeur privé?
getDeclaredConstructors
(quand vous voulez tous les constructeurs)
Retourne un tableau d'objets Constructor reflétant tous les constructeurs déclarés par la classe représentée par cet objet Class. Ce sont des constructeurs publics, protégés, d'accès par défaut (package) et privés.
getConstructors
(lorsque vous voulez seulement public
constructeurs)
Retourne un tableau contenant des objets Constructeur reflétant tous les constructeurs publics de la classe représentée par cet objet Class.
Ainsi, en regardant la documentation pour les deux, je pense qu’une différence est que getConstructors
renvoie uniquement les constructeurs public
tandis que getDeclaredConstructors
renvoie tous les constructeurs (public
, protected
, accès par défaut (package) et private
Donc, c'est simple si vous n'avez besoin que des constructeurs public
, utilisez getConstructors
. Sinon, si vous avez besoin de tous les constructeurs (sans tenir compte du modificateur d'accès du constructeur), utilisez getDeclaredConstructors
.
Les méthodes getDeclaredXX()
existent pour la manipulation de classes de manière non voulue par le fabricant de ces classes. Notez qu’il existe une méthode getDeclaredMethod()
qui vous permet d’appeler des méthodes privées et une méthode getDeclaredField()
qui vous permet d’obtenir/de définir des champs privés.
Je ne suis pas tout à fait sûr des cas d'utilisation "légitimes", mais ceux-ci sont évidemment utiles pour faire certaines choses. De plus, cette famille de méthodes ne retourne que les choses spécifiquement déclarées dans la classe, pas celles qui existent dans la classe à cause de la superclasse.
L'accès à un constructeur privé pourrait être utile pour les mêmes raisons, je suppose.
La méthode 'getDeclaredConstructors' ne renvoie que les constructeurs déclarés à l'intérieur de la classe. La méthode 'getConstructors' renvoie également les constructeurs qui ne sont pas déclarés à l'intérieur de la classe mais qui sont hérités des super classes.
Cela dépend donc de ce que vous allez faire. Il n'y a pas de bonne approche, cela dépend vraiment si vous avez également besoin de super constructeurs.
J'utilise getDeclaredConstructors
pour créer une fabrique de classes dont le constructeur est privé afin d'éviter que les "utilisateurs" de mon système puissent créer ces classes directement sans utiliser la fabrique. Je trouve cette méthode très utile.