web-dev-qa-db-fra.com

Quelle est la différence entre getDeclaredConstructors et getConstructors dans l'API de classe?

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é?

52
jayunit100

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.

56
Bhesh Gurung

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.

4
jli

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.

2
RoflcoptrException

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.

0
Rafa