Salut! je voulais savoir s'il y a une méthode pour accéder à des attributs privés d'une Classe à partir d'une autre (qui à le droit d'accédé coté conception) sans changer le Private en Public ?
Salut! je voulais savoir s'il y a une méthode pour accéder à des attributs privés d'une Classe à partir d'une autre (qui à le droit d'accédé coté conception) sans changer le Private en Public ?
Bonjour,
normalement si l'attribut est private, c'est précisément pour interdire à une autre classe d'y accéder directement. En général une classe qui veut mettre à disposition ses attributs le fera via des getters/setters, ce qui lui permet de garder un peu de contrôle sur la vie de la variable:
Si ton champ est private et que tu dois y accéder directement, c'est qu'il y a un problème de conception.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //le champ toto est private private String toto; //La méthode getToto renvoie la valeur de toto et est publique public String getToto(){ return toto; }
Ca c'était la version politiquement correcte.
Maintenant la version mains dans le cambouis. Je précise pour ma conscience que si tu dois faire ça dans une véritable application c'est très probablement une mauvaise idée puisqu'en utilisant l'api REFLECT tu fais sauter tous les mécanismes du langage java qui permettent d'assurer un code robuste et maintenable:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 import java.io.IOException; import java.lang.reflect.Field; import java.text.ParseException; public class Test { public static void main(String[] args) throws IOException, ParseException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ TestBis t = new TestBis(); Field f = TestBis.class.getDeclaredField("str"); //Récupère la définition du champ str f.setAccessible(true); // Fait sauter la protection du champ String value = (String) f.get(t); //Récupère la valeur du champ str pour l'instance t System.out.println(value); } } class TestBis{ private String str = "yop"; }
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
Partager