Usted puede utilizar Commons BeanUtilsBeanMap
para esto.
Map map = new BeanMap(someBean);
actualización: puesto que no es una opción debido a algunos problemas de dependencias biblioteca aparentes en Android, aquí hay un ejemplo básico patada de cómo podría hacerlo con poca ayuda de Reflection API:
public static Map<String, Object> mapProperties(Object bean) throws Exception {
Map<String, Object> properties = new HashMap<>();
for (Method method : bean.getClass().getDeclaredMethods()) {
if (Modifier.isPublic(method.getModifiers())
&& method.getParameterTypes().length == 0
&& method.getReturnType() != void.class
&& method.getName().matches("^(get|is).+")
) {
String name = method.getName().replaceAll("^(get|is)", "");
name = Character.toLowerCase(name.charAt(0)) + (name.length() > 1 ? name.substring(1) : "");
Object value = method.invoke(bean);
properties.put(name, value);
}
}
return properties;
}
Si java.beans
API estaban disponibles, entonces podría hacer:
public static Map<String, Object> mapProperties(Object bean) throws Exception {
Map<String, Object> properties = new HashMap<>();
for (PropertyDescriptor property : Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors()) {
String name = property.getName();
Object value = property.getReadMethod().invoke(bean);
properties.put(name, value);
}
return properties;
}
Holy crap! ¡Eso parece súper útil! ¿Sabes algo sobre sus implicaciones de rendimiento? –
La reflexión siempre tiene un costo de rendimiento. Nada contra lo que hacer. Pero puedes confiar en que los chicos de BeanUtils lo han optimizado tanto como sea posible. Es una biblioteca bastante popular. – BalusC
Cool. ¿Tengo que implementar algún tipo de interfaz en mis POJO, o estoy usando get * naming enough (estoy usando POJOs inmutables con constructores privados instanciados usando un Builder)? –