Field
, comme son nom le laisse supposer, modélise les champs d'une classe. La façon la plus simple d'obtenir un objet de type
Field
est d'utiliser l'une des méthodes
getField()
de la classe
Class
. On peut obtenir ainsi une référence sur tous les champs d'une classe, qu'il soit statique ou non, privé, protégé ou public.
La classe
Field
fonctionne sur le même principe que la classe
Class
ou
Method
. Elle permet d'obtenir les informations sur le champ d'une classe.
Method
.
getName()
: retourne le nom de ce champ.
getModifiers()
: retourne un entier qui code les modificateurs de ce champ sous forme d'un
int
. Cet entier peut être décodé grâce à la classe utilitaire
Modifier
.
getDeclaredAnnotations()
et
getAnnotation(Class)
: retourne les annotations portées par ce champ, ou l'annotation dont on passe la classe en paramètre.
getInt(Object)
,
getFloat(Object)
,
get(Object)
etc... : retournent la valeur de ce champ sous la forme indiquée par le nom de la méthode, pour l'objet passé en paramètre.
setInt(Object, int)
,
setFloat(Object, float)
,
setObject(Object, Object)
etc... : permettent de fixer la valeur de ce champ sous la forme indiquée par le nom de la méthode, pour l'objet passé en paramètre.
Exemple 53. Introspection sur un champ
String className = "org.paumard.test.classe.Marin" ; String propertyName = "nom" ; String value = "Surcouf" ; // jette une ClassNotFoundException // on utilise clazz car une variable ne peut pas s'appeler class Class<?> clazz = Class.forName(className) ; // jette IllegalAccessException et InstantiationException Object o = clazz.newInstance() ; // jette NoSuchFieldException // attention : getField() ne retourne que les champs publics, ici notre // champ est privé, donc il faut utiliser clazz.getDeclaredField() Field champNom = clazz.getDeclaredField(propertyName) ; // lecture des modificateurs de ce champ int mod = champNom.getModifiers() ; // on vérifie que notre champ est bien privé System.out.println("Champ [" + propertyName + "] privé : " + Modifier.isPrivate(mod)) ; // on le rend accessible, pour pouvoir le modifier boolean isAccessible = champNom.isAccessible() ; if (!isAccessible) { champNom.setAccessible(true) ; } // on vérifie que notre champ est toujours privé // le rendre accessible ne le modifie pas mod = champNom.getModifiers() ; System.out.println("Champ [" + propertyName + "] privé : " + Modifier.isPrivate(mod)) ; // on positionne sa valeur champNom.set(o, value) ; // on remet la propriété accessible à sa valeur // précédente if (!isAccessible) { champNom.setAccessible(false) ; } // on affiche notre marin System.out.println(o) ;
Invocation du constructeur vide Champ [nom] privé : true Champ [nom] privé : true SurcoufOn constate donc que :
accessible
d'un membre ne change pas son modificateur de visibilité !