map转化为对象

简介: <div class="markdown_views"><p>如何把Map 转化为指定对象呢? <br>先看测试:</p><pre class="prettyprint"><code class=" hljs avrasm">@Test public void test_convertMap2Obj() throws InstantiationException

如何把Map 转化为指定对象呢?
先看测试:

@Test
    public void test_convertMap2Obj() throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, IllegalArgumentException{
        Map map=new HashMap();
        map.put("personName", "黄威");
        map.put("birthdate", new Timestamp(1000255));
        map.put("identitify", "422203158895255555");
        map.put("age", 21);
        Object obj=ReflectHWUtils.convertMap2Obj(map, Person2.class);
        Person2 person=(Person2)obj;
//      System.out.println(obj);
        System.out.println(person.getPersonName());
        System.out.println(person.getAge());
        System.out.println(person.getBirthdate());
    }

运行结果:
黄威
21
1970-01-01 08:16:40.255

ReflectHWUtils.convertMap2Obj实现如下:

/***
     * convert map to object ,see setObjectValue(obj, map)
     * @param map : key是对象的成员变量,其value就是成员变量的值
     * @param clazz
     * @return
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws IllegalArgumentException
     */
    public static Object convertMap2Obj(Map<String, Object> map,Class clazz) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException, IllegalArgumentException{
        if(ValueWidget.isNullOrEmpty(map)){
            return null;
        }
        Object obj=clazz.newInstance();
        setObjectValue(obj, map);
        /*for(Iterator it=map.entrySet().iterator();it.hasNext();){
            Map.Entry<String, Object> entry=(Map.Entry<String, Object>)it.next();
            String key=entry.getKey();
            Object val=entry.getValue();
        }*/
        return obj;
    }

/***
     * 利用反射设置对象的属性值. 注意:属性可以没有setter 方法.
     * 
     * @param obj
     * @param params
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    public static void setObjectValue(Object obj, Map<String, Object> params)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        if(ValueWidget.isNullOrEmpty(obj)){
            return;
        }
        if (ValueWidget.isNullOrEmpty(params)) {
            return;
        }
        Class<?> clazz = obj.getClass();
        for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
            Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it
                    .next();
            String key = entry.getKey();
            Object propertyValue = entry.getValue();
            if (ValueWidget.isNullOrEmpty(propertyValue)) {
                continue;
            }
            Field name = getSpecifiedField(clazz, key);
            if (name != null) {
                name.setAccessible(true);
                name.set(obj, propertyValue);
            }
        }

    }

依赖的方法:

/***
     * 利用反射设置对象的属性值. 注意:属性可以没有setter 方法.
     * 
     * @param obj
     * @param params
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    public static void setObjectValue(Object obj, Map<String, Object> params)
            throws SecurityException, NoSuchFieldException,
            IllegalArgumentException, IllegalAccessException {
        if(ValueWidget.isNullOrEmpty(obj)){
            return;
        }
        if (ValueWidget.isNullOrEmpty(params)) {
            return;
        }
        Class<?> clazz = obj.getClass();
        for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
            Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it
                    .next();
            String key = entry.getKey();
            Object propertyValue = entry.getValue();
            if (ValueWidget.isNullOrEmpty(propertyValue)) {
                continue;
            }
            Field name = getSpecifiedField(clazz, key);
            if (name != null) {
                name.setAccessible(true);
                name.set(obj, propertyValue);
            }
        }

    }

    /***
     * Get Specified Field
     * 
     * @param clazz
     * @param fieldName
     * @return
     */
    public static Field getSpecifiedField(Class<?> clazz, String fieldName) {
        Field f = null;
        if (ValueWidget.isNullOrEmpty(clazz)||ValueWidget.isNullOrEmpty(fieldName)) {
            return null;
        }
        try {
            f = clazz.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            Class superClass2=clazz.getSuperclass();
            if (superClass2.getName().equals(Object.class.getName())){
                return null;
            }
            return getSpecifiedField(superClass2/*
                                                         * may be null if it is
                                                         * Object .
                                                         */, fieldName);
            // e.printStackTrace();
        }
        return f;
    }

源代码见:
源代码下载地址
跨浏览器实现placeholder

相关文章
|
8月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
110 3
|
8月前
|
存储 Java
map中存储的是引用,而不是对象本身
该内容是关于Java编程中验证Map存储引用而非复制对象的示例。创建大型List导致内存增加,说明List确实占用空间。通过Person类示例,将不同对象放入Map,改变一个对象的属性后,比较原对象与Map中的键值对,发现两者相等,证明Map保存的是对象引用。
122 5
|
8月前
|
数据处理
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
利用Stream流将取到的对象List<对象>形式数据进行分组统计转变成Map<分组条件,数量统计>形式
81 0
|
4月前
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
40 1
ES6中map对象的使用,确实比Object好使哈
|
7月前
|
Java
Java list中的对象转为list,list中的对象转为map
Java list中的对象转为list,list中的对象转为map
153 1
|
7月前
|
安全 Java
如何测试map对象的线程不安全
【6月更文挑战第20天】如何测试map对象的线程不安全
50 0
|
8月前
|
Java
SpringBoot 项目启动初始化一个Map对象到内存
SpringBoot 项目启动初始化一个Map对象到内存
163 1
|
8月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可为任意类型,有序且支持get、set、has、delete操作;Set存储唯一值,提供add、delete、has方法。两者皆可迭代。示例展示了Map和Set的基本用法,如添加、查询、删除元素。
42 2
|
8月前
|
JavaScript
js Array map映射对象多个属性
js Array map映射对象多个属性
52 0
|
8月前
|
Java
java8 转对象,Java8转Map,Java8转Llist
java8 转对象,Java8转Map,Java8转Llist
52 0