141 votes

Meilleure façon d’invoquer getter par réflexion

J'ai besoin d'obtenir la valeur d'un champ avec une annotation, Donc, avec la réflexion, je suis en mesure d'obtenir ce Champ Objet. Le problème est que ce champ sera toujours privé, mais je sais à l'avance, il aura toujours une méthode de lecture. Je sais que je peux utiliser setAccesible(vrai) et obtenez sa valeur (quand il n'y a pas de PermissionManager), bien que je préfère appeler sa méthode de lecture.

Je sais que je pourrais regarder pour la méthode par la recherche pour "get+fieldName" (même si je sais que par exemple pour les champs booléens sont souvent désignés comme des "+fieldName").

Je me demande si il ya une meilleure façon d'invoquer cette getter (de nombreux cadres de l'utilisation des getters/setters pour accéder aux attributs donc peut-être qu'ils le font d'une autre manière).

Merci

261voto

sfussenegger Points 16204

Je pense que cela devrait vous orienter vers la bonne direction:

import java.beans.*

for (PropertyDescriptor pd : Introspector.getBeanInfo(Foo.class).getPropertyDescriptors()) {
  if (pd.getReadMethod() != null && !"class".equals(pd.getName()))
    System.out.println(pd.getReadMethod().invoke(foo));
}

Notez que vous pouvez créer BeanInfo ou PropertyDescriptor cas vous-même, c'est à dire sans l'aide d'Introspection. Cependant, d'Introspection fait un peu de mise en cache interne de la sorcière est normalement une Bonne Chose (tm). Si vous êtes heureux sans cache, vous pouvez même aller pour

// TODO check for non-existing readMethod
Object value = new PropertyDescriptor("name", Person.class).getReadMethod().invoke(person);

Cependant, il y a beaucoup de bibliothèques et de simplifier la java.les haricots de l'API. Communes BeanUtils est un exemple bien connu. Là, il vous suffit de faire:

Object value = PropertyUtils.getProperty(person, "name");

BeanUtils est livré avec d'autres choses pratiques. E. g. sur la volée de la valeur de conversion de l'objet à la chaîne, chaîne d'objet) afin de simplifier la définition des propriétés de la saisie de l'utilisateur.

21voto

Naveedur Rahman Points 17

Vous pouvez utiliser le cadre de réflexions pour cela

5voto

Michael Borgwardt Points 181658

La convention d’affectation de noms fait partie de la spécification JavaBeans bien établie et est pris en charge par les classes dans le package java.beans .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X