Bean和Map的互转+Demo

原创 2016年11月29日 21:41:47

事情原由:由于数据库空值字段要作为key值保存在Map中,之前写过一篇通过mybatis配置,可以解决这样的问题,但是测试环境时因为其他表空值的原因就爆炸了,只有老老实实的通过Bean转化Map。

其中涉及的类:
Introspector:在java.beans包下,是Java 语言对 JavaBean 类属性、事件的一种缺省处理方法。
JavaBean:一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。
PropertyDescriptor:表示JavaBean类通过存储器导出一个属性。主要方法:
1. getPropertyType(),获得属性的Class对象;
  2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;
  3. hashCode(),获取对象的哈希值;
  4. setReadMethod(Method readMethod),设置用于读取属性值的方法;
  5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。

需要注意的是:javaBean转map时,如果javaBean的属性是另外一个javaBena会有问题:

{dbs=com.cn.bean2map.DemoBeanSon@1ee7b241, name=chen, age=24}

转化类:

public class MapBean {

    public static final Map<String, Object> beanToMap(Object bean)  
            throws IntrospectionException, IllegalAccessException, InvocationTargetException {  
        Map<String, Object> returnMap = new HashMap<String, Object>();  
        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());  
        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 = readMethod.invoke(bean, new Object[0]);  
                if (result != null) {  
                    returnMap.put(propertyName, result);  
                } else {  
                    returnMap.put(propertyName, "");  
                }  
            }  
        }  
        return returnMap;  
    }  

    public static final Object mapToBean(Class<?> type, Map<String, ? extends Object> map)   
            throws IntrospectionException, IllegalAccessException,  InstantiationException, InvocationTargetException {  
        BeanInfo beanInfo = Introspector.getBeanInfo(type);  
        Object obj = type.newInstance();  
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();  
        for (int i = 0; i< propertyDescriptors.length; i++) {  
            PropertyDescriptor descriptor = propertyDescriptors[i];  
            String propertyName = descriptor.getName();  
            if (map.containsKey(propertyName)) {  
                Object value = map.get(propertyName);  
                Object[] args = new Object[1];  
                args[0] = value;  
                descriptor.getWriteMethod().invoke(obj, args);  
            }  
        }  
        return obj;  
    }  

}

实体类DemoBean:

public class DemoBean {
    public String name;

    public Integer age;

    public DemoBeanSon dbs;

    public DemoBean(String name,Integer age,DemoBeanSon dbs){
        this.name=name;
        this.age=age;
        this.dbs=dbs;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public DemoBeanSon getDbs() {
        return dbs;
    }

    public void setDbs(DemoBeanSon dbs) {
        this.dbs = dbs;
    }

    public String toString(){
        return "name为:"+name+"===="+"age为:"+age+"dbs为:"+dbs.phone+"---"+dbs.num;
    }
}

实体DemoBeanSon:

public class DemoBeanSon {

    public String phone;

    public Integer num;

    public DemoBeanSon(String phone,Integer num){
        this.phone=phone;
        this.num=num;
    }
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }


}

mian方法:

public class DemoMain {

    public static void main(String[] args)
            throws IntrospectionException, IllegalAccessException, InstantiationException, InvocationTargetException {
        /*DemoBean db = new DemoBean();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "chen");
        map.put("age", 24);
        map.put("dbs", new DemoBeanSon("小米",4));
        db=(DemoBean) MapBean.mapToBean(db.getClass(), map);
        System.out.println(db);*/

        DemoBean db = new DemoBean("chen",24,new DemoBeanSon("小米",4));
        Map map=MapBean.beanToMap(db);
        System.out.println(map);
    }

}
版权声明:本文为博主原创文章,未经博主允许不得转载。

java 使用BeanInfo实现bean实体与map之间的互相转换

java 使用BeanInfo实现bean实体与map之间的互相转换。 public interface BeanInfo希望提供有关其 bean 的显式信息的 bean 实现者可以提供某个 B...
  • cuiyaoqiang
  • cuiyaoqiang
  • 2016年12月12日 14:30
  • 1729

利用Gson使json字符串与java bean/list/map之间的相互转换

public class GsonPracticeUtil { public static void main(String[] args) { Gson gson = new Gson(); ...
  • u013399093
  • u013399093
  • 2016年01月14日 15:30
  • 2454

给大家讲一个关于map和bean的故事(在SpringJdbc玩map被玩死)

下面要给大家讲一个关于map和bean的故事。。。 ------------------------------------------------ 前戏: 还记得很久以前,我在上学的时候,老师教...
  • piantoutongyang
  • piantoutongyang
  • 2016年04月02日 18:18
  • 2306

map bean实体 互转

import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspect...
  • linkkb
  • linkkb
  • 2018年01月13日 10:35
  • 22

java中的bean、list、map和JSON的互转

JSON字符串和java对象的互转【json-lib】  (原文:http://www.cnblogs.com/teach/p/5791029.html) 在开发过程中,经常需要和别...
  • chao430
  • chao430
  • 2017年10月30日 12:02
  • 91

Map与Bean互转(下划线转大写)

import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor...
  • FiangAsDre
  • FiangAsDre
  • 2017年06月22日 18:32
  • 763

java使用commons-betwixt 实现bean与xml互转

  • 2012年11月29日 14:07
  • 2.1MB
  • 下载

任意深度xml与bean的互转

  • 2014年10月10日 10:14
  • 304KB
  • 下载

利用jaxb实现xml和bean互转

  • 2015年10月24日 16:13
  • 14KB
  • 下载

java xml和map互转

  • 2017年11月24日 08:59
  • 372KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bean和Map的互转+Demo
举报原因:
原因补充:

(最多只允许输入30个字)