« Programmation Java/Réflexion » : différence entre les versions

Contenu supprimé Contenu ajouté
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ajout de l'accès à un attribut privé
Ligne 153 :
</syntaxhighlight>
 
=== Accès à un attribut publique ===
 
L'accès à un attribut publique se fait en appelant les méthodes sur l'instance de <code>java.lang.reflect.Field</code> obtenu auprès de la classe.
 
Exemple :
Ligne 182 :
</syntaxhighlight>
 
=== '''Accès à un attribut privé''' ===
Il est également possible d'avoir accès aux champs privée grâce à la méthode setAccessible de la classe Field. Cela est cependant fortement déconseillé puisque modifier les valeurs d'un champs privée revient à violer le principe d'encapsulation.
 
Exemple:<syntaxhighlight lang="java">
package org.wikibooks.fr;
 
public class Livre
{
private String titre;
private int nb_pages;
 
public Livre(String _titre, int _nb_pages) {
this.titre = _titre;
this.nb_pages = _nb_pages;
}
}
...
Class c = Class.forName("org.wikibooks.fr.Livre"); // Accès à la classe Livre
 
Constructor constr = c.getConstructor(String.class, int.class); // Obtenir le constructeur (String, int)
Object o = constr.newInstance("Programmation Java", 120); // -> new Livre("Programmation Java", 120);
 
Field f_titre = c.getField("titre"); // Erreur: titre est privé
 
Field fields[] = c.getDeclaredFields();
fields[0].setAccessible(true); // titre désormais équivalent à un attribut publique
Field f_titre = fields[0]; // Obtenir l'attribut titre
 
String titre_du_livre = (String)f_titre.get(o); // -> o.titre
f_titre.set(o, "Java"); // -> o.titre = "Java";
 
</syntaxhighlight><br />
== Exemple concret : un gestionnaire d'extensions ==
Chaque extension d'une classe lui ajoute des méthodes.