千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 从map到对象的转换

从map到对象的转换

来源:千锋教育
发布人:xqq
时间: 2023-11-21 04:11:27 1700511087

一、Java中map转对象的方式

在Java中,我们通常使用以下方法将Map转换为对象:

public static void mapToObject(Map map, Object obj) throws Exception {
    if (map == null) {
        return;
    }
    Class cls = obj.getClass();
    for (Field field : cls.getDeclaredFields()) {
        String name = field.getName();
        Object value = map.get(name);
        if (value != null) {
            field.setAccessible(true);
            field.set(obj, value);
        }
    }
}

该方法的功能是将Map中的值转换为对象的字段值。首先,我们获取对象的类及其所有字段,然后使用反射设置每个字段的值。

由该方法的实现可以看出,Map的Key必须与对象的字段名相同,而Map的Value必须与对象的字段类型相同或可转换为字段类型。

以下是示例代码:

public class User {
    private String name;
    private Integer age;
    //getters and setters
}

public static void main(String[] args) throws Exception {
    Map map = new HashMap<>();
    map.put("name", "Tom");
    map.put("age", 18);
    User user = new User();
    mapToObject(map, user);
    System.out.println(user.getName()); //"Tom"
    System.out.println(user.getAge()); //18
}

二、Spring中map转对象的方式

在Spring框架中,我们可以使用DataBinder类将Map转换为对象。

public static  void mapToObject(Map map, T obj) {
    DataBinder binder = new DataBinder(obj);
    binder.bind(new MutablePropertyValues(map));
}

该方法使用Spring提供的DataBinder类,数据绑定器将数据从源Map转换并绑定到目标对象中。

值得注意的是,该方法不要求Map中Key必须与对象的字段名相同,它将根据字段的类型进行转换。

以下是示例代码:

@Component
public class User {
    private String name;
    private Integer age;
    //getters and setters
}

@Autowired
private User user;

@Autowired
private ApplicationContext context;

public void mapToUser() {
    Map map = new HashMap<>();
    map.put("name", "Tom");
    map.put("age", "18");
    mapToObject(map, user);
    System.out.println(user.getName()); //"Tom"
    System.out.println(user.getAge()); //18
}

三、使用第三方库convertutils进行map转对象

如果我们要处理更复杂的数据类型并且需要类型转换,则可以使用Apache的commons-beanutils库。

public static  void mapToObject(Map map, T obj) throws IllegalAccessException, InvocationTargetException {
    ConvertUtils.register(new SqlTimestampConverter(null), java.sql.Timestamp.class);
    PropertyUtils.populate(obj, map);
}

该方法使用Apache Commons的BeanUtils,它使用ConvertUtils进行类型转换。在调用populate()方法之前,需要注册SqlTimestampConverter以支持java.sql.Timestamp转换。

以下是示例代码:

public class User {
    private String name;
    private Integer age;
    private Timestamp createTime;
    //getters and setters
}

public static void main(String[] args) throws Exception {
    Map map = new HashMap<>();
    map.put("name", "Tom");
    map.put("age", "18");
    map.put("createTime", "2022-08-25 12:00:00");
    User user = new User();
    mapToObject(map, user);
    System.out.println(user.getName()); //"Tom"
    System.out.println(user.getAge()); //18
    System.out.println(user.getCreateTime()); //2022-08-25 12:00:00.0
}

四、总结

在Java中,可以使用不同的方法将Map转换为对象。使用反射、数据绑定器或第三方库等。

无论使用哪种方法,都需要注意Map中Key必须与对象的字段名相同,而Map中的Value必须与对象的字段类型相同或可转换为字段类型。如此,就可以轻易地将Map转换为对象。

tags: map转对象
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT