En Java et en C#, il est possible d'invoquer une méthode privée par réflexion (comme indiqué ci-dessous).Pourquoi pouvez-vous réfléchir et appeler une méthode (pas si) privée en Java et .Net
- Pourquoi est-ce autorisé?
- Quelles sont les conséquences de cela?
- Devrait-il être retiré dans une future version de la langue?
- Est-ce que d'autres langues/plates-formes permettent cela? Si je cette classe dans Java et C#
Voici l'exemple
public class Foo
{
private void say() { WriteToConsoleMethod("Hello reflected world"); }
}
où WriteToConsole()
est un langage spécifique, alors que je peux exécuter ce qui suit pour appeler la méthode say()
privée:
C#
Foo f = new Foo();
var fooType = f.GetType();
var mi = fooType.GetMethod("say", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(f, null);
Java
Foo f = new Foo();
Method method = f.getClass().getDeclaredMethod("say", null);
method.setAccessible(true);
method.invoke(f, null);
Comme vous pouvez le voir, il est pas évident, mais ce n'est pas difficile non plus.
"Parfois ça peut être pratique" - J'ai trouvé l'occasion où je l'ai utilisé la réflexion pour tester des méthodes privées. On pourrait argumenter que, étant encapsulé, il devrait être testé à travers les interfaces fournies et les méthodes publiques. Mais parfois, ces méthodes privées encapsulent un petit peu de logique complexe avec quelques cas intéressants où des tests unitaires directs améliorent vraiment le développement. Alors oui, peut être pratique parfois! – Matt