1. 程式人生 > >java物件轉map

java物件轉map

import java.beans.BeanInfo;    
import java.beans.IntrospectionException;    
import java.beans.Introspector;    
import java.beans.PropertyDescriptor;    
import java.lang.reflect.InvocationTargetException;    
import java.lang.reflect.Method;    
import java.util.HashMap;    
import java.util.Map;    
import java.util.TreeMap;    

import com.yfapp.platform.pojo.QxmenuPojo;    

/**  
 * @檔名:ZJ_BeanToMapUtils.java  
 * @作用:  
 * @作者:張劍  
 * @建立時間:2014年3月6日  
 */    
public class ZJ_BeanToMapUtils {    
    /**  
     * 將一個 Map 物件轉化為一個 JavaBean  
     * @param clazz 要轉化的型別  
     * @param map 包含屬性值的 map  
     * @return 轉化出來的 JavaBean 物件  
     * @throws IntrospectionException 如果分析類屬性失敗  
     * @throws IllegalAccessException 如果例項化 JavaBean 失敗  
     * @throws InstantiationException 如果例項化 JavaBean 失敗  
     * @throws InvocationTargetException 如果呼叫屬性的 setter 方法失敗  
     */    
    @SuppressWarnings("rawtypes")    
    public static <T> T toBean(Class<T> clazz, Map map) {    
        T obj = null;    
        try {    
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);    
            obj = clazz.newInstance(); // 建立 JavaBean 物件    

            // 給 JavaBean 物件的屬性賦值    
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();    
            for (int i = 0; i < propertyDescriptors.length; i++) {    
                PropertyDescriptor descriptor = propertyDescriptors[i];    
                String propertyName = descriptor.getName();    
                if (map.containsKey(propertyName)) {    
                    // 下面一句可以 try 起來,這樣當一個屬性賦值失敗的時候就不會影響其他屬性賦值。    
                    Object value = map.get(propertyName);    
                    if ("".equals(value)) {    
                        value = null;    
                    }    
                    Object[] args = new Object[1];    
                    args[0] = value;    
                    try {    
                        descriptor.getWriteMethod().invoke(obj, args);    
                    } catch (InvocationTargetException e) {    
                        System.out.println("欄位對映失敗");    
                    }    
                }    
            }    
        } catch (IllegalAccessException e) {    
            System.out.println("例項化 JavaBean 失敗");    
        } catch (IntrospectionException e) {    
            System.out.println("分析類屬性失敗");    
        } catch (IllegalArgumentException e) {    
            System.out.println("對映錯誤");    
        } catch (InstantiationException e) {    
            System.out.println("例項化 JavaBean 失敗");    
        }    
        return (T) obj;    
    }    

    /**  
     * 將一個 JavaBean 物件轉化為一個 Map  
     * @param bean 要轉化的JavaBean 物件  
     * @return 轉化出來的 Map 物件  
     * @throws IntrospectionException 如果分析類屬性失敗  
     * @throws IllegalAccessException 如果例項化 JavaBean 失敗  
     * @throws InvocationTargetException 如果呼叫屬性的 setter 方法失敗  
     */    
    @SuppressWarnings("rawtypes")    
    public static Map toMap(Object bean) {    
        Class<? extends Object> clazz = bean.getClass();    
        Map<Object, Object> returnMap = new HashMap<Object, Object>();    
        BeanInfo beanInfo = null;    
        try {    
            beanInfo = Introspector.getBeanInfo(clazz);    
            PropertyDescriptor[] propertyDescriptors =   beanInfo.getPropertyDescriptors();    
            for (int i = 0; i < propertyDescriptors.length; i++) {    
                PropertyDescriptor descriptor = propertyDescriptors[i];    
                String propertyName = descriptor.getName();    
                if (!propertyName.equals("class")) {    
                    Method readMethod = descriptor.getReadMethod();    
                    Object result = null;    
                    result = readMethod.invoke(bean, new Object[0]);    
                    if (null != propertyName) {    
                        propertyName = propertyName.toString();    
                    }    
                    if (null != result) {    
                        result = result.toString();    
                    }    
                    returnMap.put(propertyName, result);    
                }    
            }    
        } catch (IntrospectionException e) {    
            System.out.println("分析類屬性失敗");    
        } catch (IllegalAccessException e) {    
            System.out.println("例項化 JavaBean 失敗");    
        } catch (IllegalArgumentException e) {    
            System.out.println("對映錯誤");    
        } catch (InvocationTargetException e) {    
            System.out.println("呼叫屬性的 setter 方法失敗");    
        }    
        return returnMap;    
    }    

    public static void main(String[] args) {    
        Map<Object, Object> map = new TreeMap<Object, Object>();    
        map.put("fsf", 1);    
        map.put("sss", "1");    
        System.out.println(map);    
        QxmenuPojo p = new QxmenuPojo();    
        p.setId(111);    
        p.setIcon("dddddd");    
        @SuppressWarnings("unchecked")    
        Map<Object, Object> m = toMap(p);    
        QxmenuPojo p2 = toBean(QxmenuPojo.class, m);    
        System.out.println(p);    
        System.out.println(p2);    
        System.out.println(m);    

    }    
}