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.
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.
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;
}
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);
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.
découvrez http://commons.apache.org/beanutils/ notamment BeanUtils.populate()
:
http://commons.apache.org/beanutils/v1.8.3/apidocs/index.html