En Java, le private
modificateur d'accès est considéré comme sûr car il n'est pas visible en dehors de la classe. Alors le monde extérieur ne connaît pas non plus cette méthode.
Mais je pensais que la réflexion Java pouvait servir à enfreindre cette règle. Considérez le cas suivant:
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
Maintenant, d'une autre classe, je vais obtenir des informations:
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
En ce moment, je pensais juste que la méthode privée était toujours sûre car pour faire quelque chose comme ci-dessus, nous devons connaître le nom de la méthode. Mais si une classe contient une méthode privée écrite par quelqu'un d'autre, nous n'avons pas de visibilité sur celles-ci.
Mais mon point est devenu invalide car en dessous de la ligne de code.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
Maintenant, cela method[]
contient toutes les choses à faire ci-dessus. Ma question est la suivante: y a-t-il un moyen d'éviter ce genre de choses en utilisant la réflexion Java?
Je cite un point de la documentation Java pour clarifier ma question.
Conseils sur le choix d'un niveau d'accès:
Si d'autres programmeurs utilisent votre classe, vous voulez vous assurer que les erreurs de mauvaise utilisation ne peuvent pas se produire. Les niveaux d'accès peuvent vous aider à le faire. Utilisez le niveau d'accès le plus restrictif qui a du sens pour un membre particulier. Utilisez privé sauf si vous avez une bonne raison de ne pas le faire.
getDeclaredMethods
renverrait des noms qui ressemblent à des déchets.