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

Object to Map 转换的三种方法


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


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import java.beans.BeanInfo;  
  2. import java.beans.IntrospectionException;  
  3. import java.beans.Introspector;  
  4. import java.beans.PropertyDescriptor;  
  5. import java.lang.reflect.Field;  
  6. import java.lang.reflect.InvocationTargetException;  
  7. import java.lang.reflect.Method;  
  8. import java.util.HashMap;  
  9. import java.util.Map;  
  10.   
  11.   
  12. /** 
  13.  * User: pengfei.hpf 
  14.  * Date: 14-5-8 
  15.  * Time: 下午12:34 
  16.  */  
  17. public class ObjectToMap {  
  18.   
  19.     public static void main(String[] args) throws IntrospectionException, InvocationTargetException, IllegalAccessException {  
  20.         TestObject o = new TestObject();  
  21.         o.setCity("beijing");  
  22.         o.setName("bj");  
  23.         o.setOrder("ASC");  
  24.   
  25.         ObjectToMap objectToMap = new ObjectToMap();  
  26.         System.out.println("=========== Invoke objectToMapViaBeanInfo ===========");  
  27.         objectToMap.objectToMapViaBeanInfo(o);  
  28.         System.out.println("=========== Invoke objectToMapViaFields ===========");  
  29.         objectToMap.objectToMapViaFields(o);  
  30.         System.out.println("=========== Invoke objectToMapViaApacheTools ===========");  
  31.         objectToMapViaApacheTools(o);  
  32.     }  
  33.   
  34.   
  35.     /** 
  36.      * 通过Introspector 的方式复制属性值 
  37.      * */  
  38.     private static void objectToMapViaBeanInfo(TestObject o) throws IntrospectionException, InvocationTargetException, IllegalAccessException {  
  39.         Map<String, Object> result = new HashMap<String, Object>();  
  40.         BeanInfo info = Introspector.getBeanInfo(o.getClass());  
  41.         for (PropertyDescriptor pd : info.getPropertyDescriptors()) {  
  42.             Method reader = pd.getReadMethod();  
  43.             //内容为null的过滤掉  
  44.             if (reader == null || reader.invoke(o) == null) {  
  45.                 continue;  
  46.             }  
  47.            //默认继承Object类的属性,过滤掉  
  48.             if (pd.getName().equalsIgnoreCase("class")) {  
  49.                 continue;  
  50.             }  
  51.             result.put(pd.getName(), reader.invoke(o));  
  52.         }  
  53.   
  54.         for (String key : result.keySet()) {  
  55.             System.out.println("Key:" + key + ";Value:" + result.get(key));  
  56.         }  
  57.   
  58.     }  
  59.   
  60.   
  61.     /** 
  62.      * 通过getDeclaredFields 的方式复制属性值 
  63.      *  getDeclaredFields方式不会返回父类的属性 
  64.      * */  
  65.     private static void objectToMapViaFields(TestObject o) throws IllegalAccessException {  
  66.         Map<String, Object> resMap = new HashMap<String, Object>();  
  67.         Field[] declaredFields = o.getClass().getDeclaredFields();  
  68.         for (Field field : declaredFields) {  
  69.             field.setAccessible(true);  
  70.             //过滤内容为空的  
  71.             if (field.get(o) == null) {  
  72.                 continue;  
  73.             }  
  74.             resMap.put(field.getName(), field.get(o));  
  75.         }  
  76.         printOut(resMap);  
  77.     }  
  78.   
  79.   
  80.     /** 
  81.      * 通过Apache beanUtils的方式复制属性值 
  82.      * 其内部实现方式同 方法1 
  83.      * */  
  84.     private static void objectToMapViaApacheTools(TestObject o) {  
  85.         Map<String, Object> resMap = new org.apache.commons.beanutils.BeanMap(o);  
  86.         printOut(resMap);  
  87.     }  
  88.   
  89.   
  90.     /** 
  91.      * 打印结果 
  92.      * */  
  93.     private static void printOut(Map<String, Object> resMap) {  
  94.         for (String key : resMap.keySet()) {  
  95.             System.out.println("Key:" + key + ";Value:" + resMap.get(key));  
  96.         }  
  97.     }  
  98.   
  99.   
  100.     /** 
  101.      * 测试类 
  102.      * */  
  103.     public static class TestObject {  
  104.         String city;  
  105.         String name;  
  106.         String order;  
  107.   
  108.         public String getOrder() {  
  109.             return order;  
  110.         }  
  111.   
  112.         public void setOrder(String order) {  
  113.             this.order = order;        }  
  114.   
  115.   
  116.         public String getName() {  
  117.             return name;  
  118.         }  
  119.   
  120.         public void setName(String name) {  
  121.             this.name = name;  
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.         }  
  2.   
  3.   
  4.         public String getCity() {  
  5.             return city;  
  6.         }  
  7.   
  8.   
  9.         public void setCity(String city) {  
  10.             this.city = city;  
  11.         }  
  12.     }  
  13. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值