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);
    }
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐