Można użyć Commons BeanUtilsBeanMap
do tego.
Map map = new BeanMap(someBean);
Aktualizacja: ponieważ to nie jest opcja ze względu na pewne pozorne problemy z zależnościami biblioteki w Androidzie, oto prosty przykład kickoff jak można zrobić to z niewielką pomocą 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;
}
Jeśli dostępne były interfejsy API java.beans
, można po prostu wykonać:
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! To wygląda na super przydatne! Czy wiesz coś na temat jego wpływu na wydajność? –
Odbicie zawsze ma wpływ na wydajność. Nic przeciwko niemu. Ale możesz ufać, że faceci BeanUtils zoptymalizowali go tak bardzo, jak to tylko możliwe. To dość popularna biblioteka. – BalusC
Cool. Czy muszę implementować dowolny interfejs w moich obiektach POJO lub czy używam get * naming wystarczająco (używam niezmiennych POJOs w/prywatnych konstruktorów utworzonych za pomocą Buildera)? –