java中Map转成JavaBean的方法实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hekai7217/article/details/79195619

map是java常用的数据结构,java中一般都是用javabean 来封装数据 他们之间怎么实现map转成javabean了

思路实现:

1.用反射操作

2.用内省操作

3.用网上的开源的工具包操作

我们一个个来看下怎么代码实现:

先写一个简单的bean:

public class User {

    private int age;

    private String name;

    private double money;

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

1.我们先来用反射来操作,步骤如下:

  1. 拿到 user的class 对象
  2. 通过反射 拿到 user的所有的属性
  3. 通过反射 给属性赋值 map中是字符串 这个地方要判断数据类型

代码实现如下:

    @SuppressWarnings("all") //消除警告
    private static void populate(Map<String, String> map, User user) throws Exception {

        //拿到 user 的对应的class对象
        Class<User> clazz = (Class<User>) user.getClass();

        //通过反射拿到所有的属性

        //拿到所有的属性值
        Field[] fields = clazz.getDeclaredFields();

        //遍历属性

        for (int i = 0; i < fields.length; i++) {
            Field f = fields[i];

            //获取属性的名称
            String key = f.getName();

            //跳过属性的权限检查
            f.setAccessible(true);

            //都是字符串 操作  进行判断

            //如果属性的类型是int 判断int.class   如果是Ingeter 判断为 Integer.class
            if (f.getType() == int.class){

                f.set(user,Integer.valueOf(map.get(key)));
            }else if (f.getType() == double.class){
                f.set(user,Double.valueOf(map.get(key)));
            }else{
                f.set(user,map.get(key));
            }

        }
    }

2.用内省操作步骤:

  1. 通过Introspector类获得Bean对象的 BeanInfo
  2. BeanInfo 来获取属性的描述器( PropertyDescriptor )
  3. 通过 PropertyDescriptor 属性描述器就可以获取某个属性对应的 getter/setter 方法(读写的方法)
  4. 通过反射机制来调用这些方法。

代码实现如下:

private static void populate1(Map<String, String> map, User user) throws Exception {

        //拿到  BeanInfo
        BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass());

        //通过 beaninfo 获取所有的描述器
        PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

        for (PropertyDescriptor pd : pds) {

            //获取属性的名字
            String name = pd.getName();

            //判断是否有这个属性
            if (map.containsKey(name)){
                //获取属性的  写的方法
                Method wMethod = pd.getWriteMethod();

                if (pd.getPropertyType() == int.class){
                    wMethod.invoke(user,Integer.valueOf(map.get(name)));

                }else if (pd.getPropertyType() == double.class){

                    wMethod.invoke(user,Double.valueOf(map.get(name)));

                }else {
                    wMethod.invoke(user,map.get(name));
                }
            }

        }
    }

3.用开源工具BeanUtils来操作:

环境搭建:

下载jar:
commons-beanutils-1.9.3.jar
commons-logging-1.1.jar

代码实现如下简单粗暴:

 /**
     * 通过 beanutils 来操作
     *
     * @param map
     * @param user
     */
    private static void populate2(Map<String, String> map, User user) {

        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

    }

方法的测试:

        Map<String, String> map = new HashMap<>();

        map.put("age", "22");

        map.put("name", "tom");

        map.put("money", "22.5");

        //map - > User

        User user = new User();

        //反射来操作
        try {
              //反射来操作
            //populate(map,user);

            //内省操作
           //populate1(map,user);
            //开源工具来操作
             populate2(map, user);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(user);


    }

本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

  • Markdown和扩展Markdown简洁的语法
  • 代码块高亮
  • 图片链接和图片上传
  • LaTex数学公式
  • UML序列图和流程图
  • 离线写博客
  • 导入导出Markdown文件
  • 丰富的快捷键

快捷键

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

Markdown及扩展

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

表格

Markdown Extra 表格语法:

项目 价格
Computer $1600
Phone $12
Pipe $1

可以使用冒号来定义对齐方式:

项目 价格 数量
Computer 1600 元 5
Phone 12 元 12
Pipe 1 元 234

定义列表

Markdown Extra 定义列表语法:
项目1
项目2
定义 A
定义 B
项目3
定义 C

定义 D

定义D内容

代码块

代码块语法遵循标准markdown代码,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

脚注

生成一个脚注1.

目录

[TOC]来生成目录:

数学公式

使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

  • 行内公式,数学公式为: Γ ( n ) = ( n 1 ) ! n N
  • 块级公式:

x = b ± b 2 4 a c 2 a

更多LaTex语法请参考 这儿.

UML 图:

可以渲染序列图:

Created with Raphaël 2.1.2 张三 张三 李四 李四 嘿,小四儿, 写博客了没? 李四愣了一下,说: 忙得吐血,哪有时间写。

或者流程图:

Created with Raphaël 2.1.2 开始 我的操作 确认? 结束 yes no
  • 关于 序列图 语法,参考 这儿,
  • 关于 流程图 语法,参考 这儿.

离线写博客

即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

博客发表后,本地缓存将被删除。 

用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

浏览器兼容

  1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下问题
    1. 不支持离线功能
    2. IE9不支持文件导入导出
    3. IE10不支持拖拽文件导入


  1. 这里是 脚注内容.

猜你喜欢

转载自blog.csdn.net/hekai7217/article/details/79195619
今日推荐