Définir les champs d'objet à partir de HashMap

Est-il une bibliothèque qui peut faire ce qui suit?:

donné un objet et un HashMap, il énumère les clés du Hashmap et cherche les setteurs pour ces clés dans l'objet et définit les valeurs associées. Quelque chose comme ça:

public Object setData(Object object, HashMap<String, Object> fields) {
   for (Entry<String, Object> entry : fields.entrySet()) {
      Method m = object.getClass().getMethod("set" + entry.getKey(), entry.getValue().getClass());
      if (m != null) {
         m.invoke(object, entry.getValue());
      }
   }
   return object;
}

la tâche semble simple au premier regard mais il y a quelques nuances que j'espère que quelqu'un a déjà prises en charge. Comme vous le savez, de réinventer la roue (la roue) est une mauvaise approche.

19
demandé sur pmr 2012-01-17 18:06:44

5 réponses

Regarder Apache Commons BeanUtils

org.apache.commons.beanutils.BeanUtils.populate(Object bean, Map properties)

Javadoc:

Peupler les propriétés JavaBeans du haricot spécifié, basé sur les paires nom/valeur spécifiées. Cette méthode utilise les API Java reflection pour identifier les noms de méthode "property setter" correspondants, et traite des arguments de setter de type String, booléen, int, long, float, et double.

19
répondu e-zinc 2012-01-17 14:16:46

Mieux utiliser BeanUtils catégorie:

public Object setData(Object object, HashMap<String, Object> fields) {
   for(Entry<String, Object> entry : fields.entrySet()) {
      BeanUtils.setProperty(object, entry.getKey(), entry.getValue());
   }
   return object;
}
7
répondu Wojtek Owczarczyk 2012-01-17 14:14:01

j'ai un BeanAsMap classe que j'ai écrit il y a longtemps. La méthode asMap retourne un Map c'est un point de vue sur un bean Java (POJO). Vous pouvez appeler putAll sur ce Map, en lui passant le Map dont vous voulez copier les données.

n'hésitez pas à utiliser mon code mentionné ci-dessus.

Exemple:

MyClass bean = ...;
Map<String, Object> inputData = ...;

Map<String, Object> view = BeanAsMap.asMap(bean);
view.putAll(inputData);
3
répondu Jesper 2012-01-17 14:16:15

BeanUtils est très bien.

mais, comme bonne pratique, je n'écrirais pas de code qui utilise la réflexion. Ou comme la dernière solution que j'ai, si personne d'autre n'a été trouvé.

ce code ne peut pas être suivi dans IDE comme Eclipse (aucune hiérarchie d'appel), ce qui fait penser au développeur que les setters ne sont jamais appelés. Il peut casser votre code et ça se compilera quand même.

un niveau trop élevé d'abstraction comme celui-ci rend le code difficile à comprendre.

Code ce qui est brouillé sera brisé par le brouilleur lui-même quand il écrira de telles choses.

Meilleure solution serait de repenser l'utilisation de la réflexion pour définir les champs d'objet.

2
répondu Jerome L 2012-01-17 14:21:54
0
répondu quaylar 2012-01-17 14:20:28