package cn.org.rapid_framework.util; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.Map; import java.util.Set; import org.springframework.beans.BeanUtils; /** * 混合两个对象为一个Map对象 * MapAndObject.get()方法将在两个对象取值,Map如果取值为null,则再在Bean中取值ֵ * @author badqiu */ public class MapAndObject implements Map{ private Map<?,?> map; private Object bean; public MapAndObject(Map map, Object bean) { super(); this.map = map; this.bean = bean; } public Map getMap() { return map; } public Object getBean() { return bean; } public Object get(Object key) { return getFromMapOrBean(key); } Object getFromMapOrBean(Object key) { Object result = null; if (map != null) { result = map.get(key); } if(result == null && bean instanceof Map) { return ((Map)bean).get(key); } if (result == null && bean != null && key instanceof String) { String propertyName = (String)key; return FastPropertyUtils.getBeanPropertyValue(bean,propertyName); } return result; } public void clear() { throw new UnsupportedOperationException(); } public boolean containsKey(Object key) { throw new UnsupportedOperationException(); } public boolean containsValue(Object value) { throw new UnsupportedOperationException(); } public Set entrySet() { throw new UnsupportedOperationException(); } public boolean isEmpty() { throw new UnsupportedOperationException(); } public Set keySet() { throw new UnsupportedOperationException(); } public Object put(Object key, Object value) { throw new UnsupportedOperationException(); } public void putAll(Map m) { throw new UnsupportedOperationException(); } public Object remove(Object key) { throw new UnsupportedOperationException(); } public int size() { throw new UnsupportedOperationException(); } public Collection values() { throw new UnsupportedOperationException(); } private static class FastPropertyUtils { private static Object getBeanPropertyValue(Object bean,String propertyName) { if(bean == null) throw new IllegalArgumentException("bean cannot be not null"); if(propertyName == null) throw new IllegalArgumentException("propertyName cannot be not null"); try { Method readMethod = getReadMethod(bean, propertyName); if(readMethod == null) { return null; } return readMethod.invoke(bean); } catch (IllegalAccessException e) { throw new IllegalStateException( "cannot get property value by property:" + propertyName + " on class:" + bean.getClass(), e); } catch (InvocationTargetException e) { throw new IllegalStateException( "cannot get property value by property:" + propertyName + " on class:" + bean.getClass(), e.getTargetException()); } } private static Method getReadMethod(Object bean, String propertyName) { PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(bean.getClass(), propertyName); if(pd == null) return null; return pd.getReadMethod(); } } }