Même si nous pensons généralement qu'il est possible d'accéder aux champs privés et aux méthodes privées d'autres classes via le mécanisme de réflexion de JAVA, ce n'est pas si difficile.
Remarque : Ce code ne fonctionnera que si vous l'exécutez dans un programme JAVA distinct, comme si vous effectuiez des tests unitaires ou un programme standard. Si vous essayez d'utiliser cette méthode dans une APPLET JAVA, vous devez modifier légèrement le SecurityManager. Cependant, comme on n’a pas souvent besoin d’y faire face, je n’entrerai pas dans les détails ici.
Voici une liste de ce contenu :
1. Accédez aux champs privés.
2. Accédez aux méthodes privées.
Accédez aux champs privés :
Pour accéder aux champs privés, vous devez appeler la méthode Class.getDeclaredField(String name) ou Class.getDeclaredFields(). Les méthodes Class.getField(String name) et Class.getFields() renvoient uniquement des champs communs, elles n'ont donc aucun effet. Voici un exemple de classe contenant des champs privés, et sous la classe se trouve du code qui accède aux champs privés par réflexion.
Copiez le code comme suit :
classe publique PrivateObject {
private String privateString = null; //Déclaré comme champ privé
public PrivateObject (String privateString) {
this.privateString = privateString;
}
}
Copiez le code comme suit :
PrivateObject privateObject = new PrivateObject("The Private Value");//instancier l'objet
Champ privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//Autoriser l'accès aux champs privés
String fieldValue = (String) privateStringField.get(privateObject);//Obtenir la valeur du champ privé
System.out.println("fieldValue = " + fieldValue);
Ce code imprimera le texte "fieldValue = The Private Value", qui se trouve être la valeur du champ privé privateString de l'objet PrivateObject.
Notez que nous avons utilisé la méthode PrivateObject.class.getDeclaredfield("privateString"). C'est cet appel à cette méthode qui renvoie le champ privé. Cette méthode renvoie uniquement les champs basés sur la classe spécifiée et ne renverra pas les champs déclarés par la classe parent.
Regardez également attentivement les déclarations en gras. En appelant Field.setAccessible(true), vous désactivez la vérification d'accès pour cette instance de champ spécifiée, ce qui n'est efficace que pour la réflexion. Vous pouvez désormais y accéder, qu'il soit privé, protégé ou par défaut, même si l'appelant n'est pas dans cette portée. Vous ne pouvez toujours pas accéder au champ via les méthodes habituelles car le compilateur ne le permet pas.
Accéder aux méthodes privées <BR>Pour accéder à une méthode privée, vous devez appeler la méthode Class.getDeclaredMethod(String name,Class[] ParameterTypes) ou Class.getDeclaredMethods(). Les méthodes Class.getMethod(String name,Class[] ParameterTypes) et Class.getMethods() renvoient uniquement des méthodes publiques, elles ne joueront donc aucun rôle. Vous trouverez ci-dessous un exemple simple de classe avec des méthodes privées. Sous la classe se trouve le code qui accède aux méthodes privées par réflexion.
Copiez le code comme suit :
classe publique PrivateObject {
chaîne privée privateString = null ;
public PrivateObject (String privateString) {
this.privateString = privateString;
}
chaîne privée getPrivateString(){//méthode Private
renvoie this.privateString ;
}
}
Copiez le code comme suit :
PrivateObject privateObject = new PrivateObject("La valeur privée");
Méthode privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
Chaîne returnValue = (Chaîne)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
Cet exemple de code imprime le texte « returnValue = The private Value », qui se trouve être la valeur de retour de la méthode privée.