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 :
- Autoriser l'accès direct aux champs privés... peut-être avec un avertissement.
- 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.
- 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 ?