从POJO生成Map <String,String>

我有一个POJO,和一个(目前尚未build成)的类,将返回它的列表。 我想自动生成POJO作为Map访问所需的代码。 这是一个好主意,是否有可能自动执行,我是否需要手动为每个POJO我想这样对待?

谢谢,安迪

Solutions Collecting From Web of "从POJO生成Map <String,String>"

你可以使用Commons BeanUtils BeanMap这个。

 Map map = new BeanMap(someBean); 

更新 :因为这不是一个选项,由于在Android中的一些明显的库依赖问题,这里是一个基本的开创性的例子,你可以在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; } 

如果java.beans API可用,那么你可以这样做:

 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; } 

这是我自己的实现没有任何依赖。 它不是复制对象的状态,而是在pojo上实现一个活动的Map。 Android 不支持 java.beans,但可以使用openbeans 。

 import java.beans.*; // Or, import com.googlecode.openbeans.* import java.util.*; public class BeanMap extends AbstractMap<String, Object> { private static final Object[] NO_ARGS = new Object[] {}; private HashMap<String, PropertyDescriptor> properties; private Object bean; public BeanMap(Object bean) throws IntrospectionException { this.bean = bean; properties = new HashMap<String, PropertyDescriptor>(); BeanInfo info = Introspector.getBeanInfo(bean.getClass()); for(PropertyDescriptor property : info.getPropertyDescriptors()) { properties.put(property.getName(), property); } } @Override public Object get(Object key) { PropertyDescriptor property = properties.get(key); if(property == null) return null; try { return property.getReadMethod().invoke(bean, NO_ARGS); } catch (Exception e) { throw new RuntimeException(e); } } @Override public Object put(String key, Object value) { PropertyDescriptor property = properties.get(key); try { return property.getWriteMethod().invoke(bean, new Object[] {value}); } catch (Exception e) { throw new RuntimeException(e); } } @Override public Set<Map.Entry<String, Object>> entrySet() { HashSet<Map.Entry<String, Object>> result = new HashSet<Map.Entry<String, Object>>(properties.size() * 2); for(PropertyDescriptor property : properties.values()) { String key = property.getName(); Object value; try { value = property.getReadMethod().invoke(bean, NO_ARGS); } catch (Exception e) { throw new RuntimeException(e); } result.add(new PropertyEntry(key, value)); } return Collections.unmodifiableSet(result); } @Override public int size() { return properties.size(); } @Override public boolean containsKey(Object key) { return properties.containsKey(key); } class PropertyEntry extends AbstractMap.SimpleEntry<String, Object> { PropertyEntry(String key, Object value) { super(key, value); } @Override public Object setValue(Object value) { super.setValue(value); return BeanMap.this.put(getKey(), value); } } }