2010-09-03 12 views
4

J'ai un bean dont les propriétés sont accessibles par réflexion. Je reçois les noms de propriété sous forme de chaîne. Les haricots ont des méthodes getter pour leurs champs privés.getDeclaredField (String) par rapport à getMethod (String) pour les champs privés dans un bean

Je reçois actuellement le champ en utilisant getDeclaredField(fieldName), le rendant accessible en utilisant setAccessible(true), puis en récupérant sa valeur en utilisant get. Une autre façon de s'y prendre serait de mettre en majuscule le nom du champ et d'ajouter get à l'avant de celui-ci, puis obtenir la méthode par ce nom de la classe et finalement invoquer la méthode pour obtenir la valeur du champ privé .

Quelle est la meilleure solution?

EDIT

Peut-être que je devrais expliquer ce que je veux dire par « mieux » ... Par « mieux », je veux dire dans le sens des meilleures pratiques. Ou, s'il y a des mises en garde subtiles ou des différences.

Répondre

1

Cela dépend de votre utilisation, mais en général, je préférerais utiliser le getter car c'est la façon "normale" et dans les autres cas faire ce que le développeur de la classe s'attend à faire. En principe, si le développeur de la classe a rendu le champ privé, il est libre de faire ce qu'il veut, comme par exemple le supprimer plus tard s'il peut être calculé d'une autre manière. Alors le fieldaccess va se rompre, espérons-le tout de suite, si vous êtes malchanceux 3 mois plus tard alors que personne ne se souvient plus. Notez qu'il existe des librairies comme Apache commons BeanUtils (je crois qu'il en existe une aussi au printemps) qui le fait pour vous et offre une interface plus saine, comme une carte de hachage par exemple.

+0

Merci d'avoir mentionné 'BeanUtils'. Je ne savais pas à ce sujet. Ma prochaine question allait être de savoir s'il y a des bibliothèques qui font cela. Je ne voulais pas réinventer la roue. :) –

+0

Accepter cette réponse car elle répond directement à ma question initiale. –

+0

De rien et merci. –

0

Mieux de quelle manière?

Vous pourriez écrire un test unitaire de 20 lignes pour voir lequel est le plus rapide. Vous pouvez écrire les deux et les regarder pour voir lequel est le plus facile à lire. Si une façon est à la fois plus facile à lire et plus rapide, allez-y. Si ce n'est pas le cas, vous devrez choisir votre poison ...

1

Peut-être utiliser la méthode getter, car il peut avoir un comportement supplémentaire en plus de simplement retourner la valeur de la propriété. Cependant cela dépend de la classe.

1

Vous pouvez jeter un oeil à la classe Introspector, est un emballage bien si vous voulez traiter uniquement avec des propriétés qui ont été exposés, vous pouvez obtenir un objet BeanInfo puis appelez getPropertyDescriptors(), par exemple:

final BeanInfo info = Introspector.getBeanInfo(clazz); 
for (PropertyDescriptor prop : info.getPropertyDescriptors()) { 
    final Method read = prop.getReadMethod(); 
    if (read != null) { 
     // do something 
    } 
} 
+0

Merci! Exactement ce que je cherchais. –