java 使用反射转换对象 Object to Map_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2253 | 回复: 0   主题: java 使用反射转换对象 Object to Map        下一篇 
    本主题由 hui.chen 于 2015-7-30 15:23:15 移动
shunzi
注册用户
等级:上尉
经验:782
发帖:133
精华:0
注册:2011-10-10
状态:离线
发送短消息息给shunzi 加好友    发送短消息息给shunzi 发消息
发表于: IP:您无权察看 2015-7-28 17:10:20 | [全部帖] [楼主帖] 楼主

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;
publicclass ObjectToMap {
      publicstaticvoid 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 的方式复制属性值
     * */
      privatestaticvoid 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方式不会返回父类的属性
     * */
      privatestaticvoid 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
     * */
      privatestaticvoid objectToMapViaApacheTools(TestObject o) {
            Map<String, Object> resMap = new org.apache.commons.beanutils.BeanMap(o);
            printOut(resMap);
      }
      /**

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

     * 测试类
     * */
      publicstaticclass TestObject {
            String city;
            String name;
            String order;
            public String getOrder() {
                  return order;
            }
            publicvoid setOrder(String order) {
            this.order = order; }
            public String getName() {
                  return name;
            }
            publicvoid setName(String name) {
                  this.name = name;
            }
            public String getCity() {
                  return city;
            }
            publicvoid setCity(String city) {
                  this.city = city;
            }
      }
}


--转自 北京联动北方科技有限公司

该贴由hui.chen转至本版2015-7-30 15:23:15



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论