首页 > 代码库 > java 使用反射转换对象 Object to Map

java 使用反射转换对象 Object to Map

Object to Map 转换的三种方法


就是把对象以及其对应的属性名 和属性值, 映射到一个Map中


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


/**
 * User: pengfei.hpf
 * Date: 14-5-8
 * Time: 下午12:34
 */
public class ObjectToMap {

    public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
        TestObject o = new TestObject();
        o.setCity("beijing");
        o.setName("bj");
        o.setOrder("ASC");

        ObjectToMap objectToMap = new ObjectToMap();
        System.out.println("=========== Invoke objectToMapViaBeanInfo ===========");
        objectToMap.objectToMapViaBeanInfo(o);
        System.out.println("=========== Invoke objectToMapViaFields ===========");
        objectToMap.objectToMapViaFields(o);
        System.out.println("=========== Invoke objectToMapViaApacheTools ===========");
        objectToMapViaApacheTools(o);
    }


    /**
     * 通过Introspector 的方式复制属性值
     * */
    private static void objectToMapViaBeanInfo(TestObject o) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
        Map<String, Object> result = new HashMap<String, Object>();
        BeanInfo info = Introspector.getBeanInfo(o.getClass());
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            Method reader = pd.getReadMethod();
            //内容为null的过滤掉
            if (reader == null || reader.invoke(o) == null) {
                continue;
            }
           //默认继承Object类的属性,过滤掉
            if (pd.getName().equalsIgnoreCase("class")) {
                continue;
            }
            result.put(pd.getName(), reader.invoke(o));
        }

        for (String key : result.keySet()) {
            System.out.println("Key:" + key + ";Value:" + result.get(key));
        }

    }


    /**
     * 通过getDeclaredFields 的方式复制属性值
     *  getDeclaredFields方式不会返回父类的属性
     * */
    private static void objectToMapViaFields(TestObject o) throws IllegalAccessException {
        Map<String, Object> resMap = new HashMap<String, Object>();
        Field[] declaredFields = o.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            //过滤内容为空的
            if (field.get(o) == null) {
                continue;
            }
            resMap.put(field.getName(), field.get(o));
        }
        printOut(resMap);
    }


    /**
     * 通过Apache beanUtils的方式复制属性值
     * 其内部实现方式同 方法1
     * */
    private static void objectToMapViaApacheTools(TestObject o) {
        Map<String, Object> resMap = new org.apache.commons.beanutils.BeanMap(o);
        printOut(resMap);
    }


    /**
     * 打印结果
     * */
    private static void printOut(Map<String, Object> resMap) {
        for (String key : resMap.keySet()) {
            System.out.println("Key:" + key + ";Value:" + resMap.get(key));
        }
    }


    /**
     * 测试类
     * */
    public static class TestObject {
        String city;
        String name;
        String order;

        public String getOrder() {
            return order;
        }

        public void setOrder(String order) {
            this.order = order;        }


        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }


        public String getCity() {
            return city;
        }


        public void setCity(String city) {
            this.city = city;
        }
    }
}