Supposons que tu ais une classe MyClass avec la méthode privée aMethod
tu as un objet de cette class
MyClass obj = new MyClass();
et tu aimerais pouvoir écrire
Mais comme elle est privé tu ne peux pas.
l'introspection te permet de connaitre toutes les méthodes de ta classe, au moment de l'exécution.
quelque chose comme ça (pseudo code)
1 2 3 4
| List<Method> lst = obj.getClass().getListOfMethods();
for (Method m : lst) {
system.out.println(m.getName());
} |
sur chaque méthode tu peux connaitre son nom ses restrictions ses paramètres son type de retour
mais tu peux surtout l'appeler. (pseudo code)
1 2
| Method m = obj.getClass().getMethod("aMethod");
system.out.println(m.invoke(obj)); //ce qui revient à faire obj.aMethod() |
Si tu fait ça tu vas obtenir une exception Illegal Access car la méthode est privé et tu n'y a pas accès.
quand je parle de tricher c'est que java te permet tout de même de faire cet appel en passant outre les restrictions quelque chose qui ressemblerait à ça (pseudo code)
1 2
| Method m = obj.getClass().getMethod("aMethod");
system.out.println(m.invokeIgnoreRestrictions(obj)); //ce qui revient à faire obj.aMethod() alors même qu'elle est privée. |
j'appelle ça tricher car si le développeur à mis la méthode privé c'est pour qu'elle ne soit pas accessible.
la modularisation va changer la donne en ce sens que si la classe est dans un package qui n'est pas exporté par le module
non seulement tu ne pourras pas passer outre la restrictions mais tu ne verras même pas la méthode.
c'est déjà vrais avec les modules OSGi
tu définis une interface publique et une implémentation privée
dans le jar contenant l’implémentation via l'introspection tu peux faire ce que nous venons de décrire
mais dans un autre jar qui accède à l'implémentation via un service tu ne vois que la partie exporte (l'interface)
si via l'introspection tu cherche à accéder à l'implémentation tu tombe sur une classe appelée Proxy qui ne contient aucune donnée et aucune autre méthodes que celles de l'interface. tu n'a donc accès à rien.
ce qui est un gage de sécurité.
A+JYT
Partager