27 votes

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

Je remarque que dans l'API Reflection de Java, il existe deux méthodes différentes pour invoquer les constructeurs : la méthode getDeclaredConstructors / getConstructors méthode. Bien que la documentation Java soit légèrement différente ( getDeclaredConstructors semble impliquer qu'elle renvoie TOUS les constructeurs, plutôt que les constructeurs publics), on ne voit pas bien 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 invoquons des classes de manière dynamique ? Par exemple, quel est l'intérêt d'accéder à un constructeur privé ?

32voto

Bhesh Gurung Points 24875

getDeclaredConstructors (quand vous voulez todos les constructeurs)

Renvoie un tableau d'objets Constructor reflétant tous les constructeurs déclarés par la classe représentée par cet objet Class. Il s'agit des constructeurs publics, protégés, à accès par défaut (package) et privés.

getConstructors (quand vous voulez seulement public constructeurs)

Renvoie un tableau contenant des objets Constructor reflétant tous les constructeurs publics de la classe représentée par cet objet Class.

Donc, en regardant les docs pour les deux, je pense qu'une différence est que getConstructors retours uniquement public tandis que getDeclaredConstructors retourne tous les constructeurs ( public , protected l'accès par défaut (paquet), et private )

Donc, c'est facile si vous avez seulement besoin de la public les constructeurs utilisent alors getConstructors . Sinon, si vous avez besoin de tous les constructeurs (sans tenir compte du modificateur d'accès du constructeur), utilisez alors getDeclaredConstructors .

6voto

RoflcoptrException Points 22111

La méthode 'getDeclaredConstructors' renvoie uniquement les constructeurs qui sont déclarés dans la classe. La méthode 'getConstructors' renvoie également les constructeurs qui ne sont pas déclarés dans la classe mais qui sont hérités des super classes.

Donc ça dépend de ce que vous allez faire. Il n'y a pas de bonne approche, cela dépend vraiment si vous avez aussi besoin de super constructeurs.

2voto

jli Points 4327

En getDeclaredXX() Il existe des méthodes permettant de manipuler des classes d'une manière qui n'était pas nécessairement prévue par le créateur de ces classes. Notez qu'il existe un getDeclaredMethod() qui vous permet d'invoquer des méthodes privées, et 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 ils sont manifestement utiles pour faire certaines choses. En outre, cette famille de méthodes ne renvoie que les éléments spécifiquement déclarés dans la classe, et non les éléments qui existent dans la classe à cause de la superclasse.

Accéder à un constructeur privé pourrait être utile pour les mêmes raisons, je suppose.

0voto

Rafa Points 877

J'utilise getDeclaredConstructors pour créer une fabrique de classes dont le constructeur est privé pour é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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X