`

javaBean与Map<String,Object>互转

    博客分类:
  • Java
阅读更多

javaBean与Map<String,Object>互转

 

From: http://blog.csdn.net/cuidiwhere/article/details/8130434

 

1. 为什么要实现javaBean与Map<String,Object>相互转换?

用过spring的都知道spring的MVC框架中有一个BaseCommandController对象,利用这个对象我们就可以很方便的将从客户端传递过来的参数封装到一个JavaBean对象中去,而不需要我们request.getParameter("name");bean.setName(name);了,从而也简化了不少的工作。如果大家用过BeanUtils.populate的话,就知道,这个方法是可以很方便的将request提交的页面表单自动填写到你创建的对象中

2. 如何实现javaBean与Map<String,Object>相互转换?

方法1: 利用java.beans.Introspector和java.beans.PropertyDescriptor实现 javaBean与Map<String,Object>互转

方法2: 利用org.apache.commons.beanutils.BeanUtils工具类,BeanUtils.populate实现Map 转换为javaBean 

 

package javaStudyDemo.bean.reflect.test;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import javaStudyDemo.others.PersonBean;

import org.apache.commons.beanutils.BeanUtils;

/**
 * 当把Person类作为BeanUtilTest的内部类时,程序出错<br>
 * java.lang.NoSuchMethodException: Property '**' has no setter method<br>
 * 本质:内部类 和 单独文件中的类的区别 <br>
 * BeanUtils.populate方法的限制:<br>
 * The class must be public, and provide a public constructor that accepts no arguments. <br>
 * This allows tools and applications to dynamically create new instances of your bean, <br>
 * without necessarily knowing what Java class name will be used ahead of time
 */
public class BeanUtilTest {

    public static void main(String[] args) {

        PersonBean person = new PersonBean();
        Map<String, Object> mp = new HashMap<String, Object>();
        mp.put("name", "Mike");
        mp.put("age", 25);
        mp.put("mN", "male");

        // 将map转换为bean
        transMap2Bean2(mp, person);

        System.out.println("--- transMap2Bean Map Info: ");
        for (Map.Entry<String, Object> entry : mp.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        System.out.println("--- Bean Info: ");
        System.out.println("name: " + person.getName());
        System.out.println("age: " + person.getAge());
        System.out.println("mN: " + person.getmN());

        // 将javaBean 转换为map
        Map<String, Object> map = transBean2Map(person);

        System.out.println("--- transBean2Map Map Info: ");
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

    }

    // Map --> Bean 2: 利用org.apache.commons.beanutils 工具类实现 Map --> Bean
    public static void transMap2Bean2(Map<String, Object> map, Object obj) {
        if (map == null || obj == null) {
            return;
        }
        try {
            BeanUtils.populate(obj, map);
        } catch (Exception e) {
            System.out.println("transMap2Bean2 Error " + e);
        }
    }

    // Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean
    public static void transMap2Bean(Map<String, Object> map, Object obj) {

        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();

                if (map.containsKey(key)) {
                    Object value = map.get(key);
                    // 得到property对应的setter方法
                    Method setter = property.getWriteMethod();
                    setter.invoke(obj, value);
                }

            }

        } catch (Exception e) {
            System.out.println("transMap2Bean Error " + e);
        }

        return;

    }

    // Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map
    public static Map<String, Object> transBean2Map(Object obj) {

        if(obj == null){
            return null;
        }        
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                String key = property.getName();

                // 过滤class属性
                if (!key.equals("class")) {
                    // 得到property对应的getter方法
                    Method getter = property.getReadMethod();
                    Object value = getter.invoke(obj);

                    map.put(key, value);
                }

            }
        } catch (Exception e) {
            System.out.println("transBean2Map Error " + e);
        }

        return map;

    }
}

 

public class PersonBean {

    private String  name;
    private Integer age;
    private String  mN;

    /**
     * @return the mN
     */
    public String getmN() {
        return mN;
    }

    /**
     * @param mN the mN to set
     */
    public void setmN(String mN) {
        this.mN = mN;
    }


    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * @param age the age to set
     */
    public void setAge(Integer age) {
        this.age = age;
    }

}

 

 

总结:  javaBean与Map<String,Object>互转利用到了java的内省( Introspector )和反射(reflect)机制。 其思路为: 通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器PropertyDescriptor,再利用属性描述器获取某个属性对应的 getter/setter 方法,然后通过反射机制来getter和setter。

 

什么是内省? 

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 PersonBean中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。注意: PersonBean中属性mN的getter/setter方法必须满足javaBean命名规范,即getmN,不能写作getMN,否则转换失败。详情参考  http://blog.renren.com/share/236384819/5598710664

分享到:
评论
1 楼 廖光浩 2014-07-16  

相关推荐

    List<Map>转化为List工具类

    一般使用springjdbc、hibernate的sql查询,库获取到的数据都是List&lt;Map&lt;String, Object&gt;&gt;结果集,如果我们要转化为JavaBean,则需要做一系列的map.get(),然后obj.set()。 此工程中就是解决List&lt;Map&lt;String, Object&gt;...

    Springboot2.1.4+redis+mysql

    Map&lt;String,Object&gt; map = new HashMap&lt;&gt;(); // String objectStr="{\\\\"username\":\"老李\",\"nickname\":\"李刚\",\"remark\":\"肚痛\"}"; // String basestr = Base64.getBase64(objectStr); String ...

    java Map转换成bean,利用java反射以及java和bean包

    java Map转换成bean,利用java反射以及java和bean包将map&lt;String,Object&gt;类型集合转换成需要的javaBean

    根据数据库表自动产生javabean

    public class ObjectUtil { //public static Object request2Obj... public static Map&lt;String, Object&gt; request2Map(HttpServletRequest request) { return request.getParameterMap(); } }

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    &lt;taskdef name="genactionscript" classname="org.expressme.ant.JavaBean2ActionScriptTask"&gt; &lt;classpath refid="build-classpath" /&gt; &lt;/taskdef&gt; &lt;taskdef name="genremoteobject" classname="org....

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    &lt;source&gt;org.expressme.employee.mgmt.flex.FlexServiceImpl&lt;/source&gt; &lt;scope&gt;application&lt;/scope&gt; &lt;/properties&gt; &lt;/destination&gt; 服务名称通过 destination 的 id 属性指定,Flex 前端通过该服务名称来...

    BeanUtils.zip

    BeanUtils.populate(Object,Map&lt;String,? extends Object&gt;) 将Map集合快速映射到javaBean: 配合文章使用:https://blog.csdn.net/qq_42292831/article/details/106336288

    ORM软件monalisa-orm.zip

    new User().parse("&lt;data&gt; &lt;name&gt;china01&lt;/name&gt;&lt;status&gt;1&lt;/status&gt; &lt;/data&gt;").save(); //select User.SELECT().selectByPrimaryKey(1); //SQL: SELECT * FROM `user` WHERE `name` = 'zzg.zhou' User.SELECT()....

    TranXBean:一个易于使用的 Java 库,用于 XML 和 JavaBean 之间的转换。-开源

    TranXBean 提供了最简单的方法来帮助您以不需要了解和处理任何 DOM 模型的方式将 xml 转换为 bean 以及... 此外,它还附带了一个 XML Lite-object-database 来提供基本的 Object 持久化和搜索功能。 太棒了,试试看吧~

    Json-RPC for java Example

    特殊的地方是,通过JS调用java对象方法的时候只能传入简单类型的参数,比 如:String,int,float,long、Object(对应java的javabean或map)等。 示例代码内置使用说明文档 声明纯属学习用转载: 最新的资源,请到...

    Json-RPC for java中文手册

    特殊的地方是,通过JS调用java对象方法的时候只能传入简单类型的参数,比 如:String,int,float,long、Object(对应java的javabean或map)等。 json rpc for java的使用 请从...

    java面试题

    创建了几个String Object? 答:创建了两个String对象,一个保存的引用地址,一个保存实际的值。 数组有没有length()这个方法?String呢? 答:数组里面没有length()方法,而是length属性。String有length()这个方法...

    JAVA面试题最全集

    77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何进行版本控制? 81.UML中,类视图如何表示类中的继承与聚合? 82.客户端游标与服务器端游标的区别? 83...

    超级有影响力霸气的Java面试题大全文档

     动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件...

    java 面试题 总结

    动态INCLUDE用jsp:include动作实现 &lt;jsp:include page="included.jsp" flush="true" /&gt;它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的...

    java基础题 很全面

    创建了几个String Object? 10 23. Java有没有goto? 10 24. 启动一个线程是用run()还是start()? 10 25. 给我一个你最常见到的runtime exception。 10 26. 接口是否可继承接口? 抽象类是否可实现(implements)接口? ...

    最新Java面试宝典pdf版

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

    Java面试宝典2010版

    创建了几个String Object? 二者之间有什么区别? 34、String 和StringBuffer的区别 35、如何把一段逗号分割的字符串转换成一个数组? 36、数组有没有length()这个方法? String有没有length()这个方法? 37、下面...

    Java面试笔试资料大全

    创建了几个String Object? 二者之间有什么区别? 23 34、String 和StringBuffer的区别 23 35、如何把一段逗号分割的字符串转换成一个数组? 24 36、数组有没有length()这个方法? String有没有length()这个方法? 24 ...

Global site tag (gtag.js) - Google Analytics