example - map string string java
Establecer campos de objetos de HashMap (5)
¿Hay alguna biblioteca que pueda hacer lo siguiente ?:
Dado un objeto y un HashMap, enumera las claves del Hashmap y busca los configuradores para estas claves en el Objeto y establece los valores asociados. Algo que se ve así:
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 tarea parece simple a primera vista, pero hay algunos matices que espero que alguien ya haya cuidado. Como saben, reinventar la rueda (la rueda buena) es un mal enfoque.
BeanUtils está bien.
Pero, como buena práctica, no escribiría código que use reflexión. O como la última solución que tengo, si no se ha encontrado ninguna otra.
Este código no se puede rastrear en IDE como Eclipse (sin jerarquía de llamadas), lo que hace que el desarrollador piense que nunca se llama a los configuradores. Él puede romper tu código y eso aún se compilará.
Un nivel de abstracción demasiado alto como este hace que el código sea difícil de entender.
El código que está siendo ofuscado será roto por el ofuscador mismo al escribir tales cosas.
La mejor solución sería repensar el uso de la reflexión para establecer los campos de objeto.
Consulte http://commons.apache.org/beanutils/ , en particular BeanUtils.populate()
:
http://commons.apache.org/beanutils/v1.8.3/apidocs/index.html
Mejor uso de la clase BeanUtils
:
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;
}
Mira a Apache Commons BeanUtils
org.apache.commons.beanutils.BeanUtils.populate(Object bean, Map properties)
Javadoc:
Rellene las propiedades JavaBeans del bean especificado, en función de los pares de nombre / valor especificados. Este método utiliza las API de reflexión de Java para identificar los nombres de los métodos del "establecedor de propiedades" correspondientes, y trata los argumentos del establecedor de tipo String, boolean, int, long, float y double.
Tengo una clase de BeanAsMap
que escribí hace mucho tiempo. El método asMap
devuelve un Map
que es una vista en un bean Java (POJO). Puede llamar a putAll
en ese Map
, pasándole el Map
que desea copiar los datos.
Siéntase libre de usar mi código mencionado anteriormente.
Ejemplo:
MyClass bean = ...;
Map<String, Object> inputData = ...;
Map<String, Object> view = BeanAsMap.asMap(bean);
view.putAll(inputData);