3 votes

Pourquoi est-il possible d'accéder à des données/classes privées via la réflexion ?

En Java, au moment de l'exécution, il est possible d'accéder à un champ privé en utilisant la réflexion et également à une classe privée imbriquée/intérieure en utilisant la réflexion (voir par exemple ici ). Existe-t-il une raison technique spécifique, ou une philosophie générale de conception, qui explique pourquoi Java est comme ça ? Je ne sais pas, mais en lisant este il semble que pour C#/.NET, au moins dans certaines configurations, la même chose ne soit pas possible. Java dispose-t-il également de cette flexibilité ? Existe-t-il des implémentations de la JVM où cela n'est pas possible ?

Bien sûr, même si Java ne permettait pas l'accès aux champs privés par réflexion, vous pouvez toujours écrire votre propre runtime pour faire ce que vous voulez. Ou vous pouvez modifier le fichier binaire .jar/.class et changer les modificateurs d'accès (je suppose que c'est possible).

Il semble donc que les concepteurs de Java aient eu le choix entre trois possibilités :

  1. Autoriser l'accès direct aux champs privés... peut-être avec un avertissement.
  2. Ne pas autoriser l'accès direct aux champs privés, mais autoriser l'accès aux champs privés en utilisant la réflexion.
  3. N'autorisez pas l'accès direct aux champs privés et n'autorisez pas non plus l'accès aux champs privés par réflexion. La seule façon d'accéder aux champs privés est de modifier le runtime ou de modifier le fichier binaire .jar/.class hors ligne.

Le choix du milieu me semble arbitraire... si l'objectif est de rendre la situation aussi peu pratique que possible, le choix 3 est le meilleur. Si le but est de ne pas ajouter des inconvénients artificiels à des choses qui ne peuvent pas être vraiment évitées de toute façon, le choix 1 est le meilleur.

Y a-t-il quelque chose dans le langage ou le runtime qui a influencé ou forcé la décision de faire le choix 2 ?

2voto

dimo414 Points 7128

En un sens, l'utilisation de la réflexion n'est-elle pas exactement l'avertissement que vous recherchez dans le numéro 1 ?

Parfois, l'utilisation de la réflexion permet de trouver des solutions élégantes à des problèmes autrement fastidieux. La façon dont la bibliothèque GSON crée et remplit les objets en est un bon exemple. Le code "normal" ne devrait pas accéder à ces champs privés, et l'utilisation de la réflexion vous permet de le faire, avec tous les frais généraux nécessaires à la gestion des exceptions et à la modification des permissions pour qu'il soit clair que ce n'est pas quelque chose à faire dans le cas général.

Reflection offre bien plus de fonctionnalités que le simple accès aux champs privés. Il vous permet, au moment de l'exécution, d'inspecter des données sur les classes et les objets que vous ne pouvez pas connaître au moment de la compilation et de les utiliser pour appeler des méthodes et accéder à des champs qui n'existaient pas lorsque votre code a été compilé. L'accès privé est un sous-ensemble de ce comportement.

Alors oui, les concepteurs de Java auraient pu créer une sorte de syntaxe pour l'accès privé, mais ils ont également dû créer la réflexion, qui est un moyen plus logique et plus puissant d'accéder aux données privées ; tout en précisant clairement (ne serait-ce que parce que c'est compliqué) que ce comportement doit être utilisé avec prudence. Pour moi, le simple fait d'appeler object.privates.field ou quelque chose de similaire n'implique pas la même sévérité.

0voto

Jesus Ramos Points 15798

Parfois, vous avez besoin d'accéder à des champs privés pour les tests unitaires. Par exemple, pour tester de petites fonctions privées dans une classe qui est utilisée en interne mais qui ne doit pas être appelée directement. D'autres fois, vous pouvez vouloir vérifier si une structure de données interne contient les bonnes données.

Si vous utilisez la réflexion comme moyen d'accéder à des données privées pour d'autres raisons, vous devez probablement trouver une bonne raison de le faire, car la plupart des personnes qui examinent votre code (s'il y en a) le remarqueront probablement et ce sera un signal d'alarme (le champ est privé pour une raison, n'est-ce pas ?).

Le choix 2 a probablement été fait pour permettre cette utilisation de la réflexion (qui peut être désactivée dans vos constructions non déboguées).

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