百科狗-知识改变命运!
--

从map到对象的转换

百变鹏仔1年前 (2023-11-21)阅读数 24#技术干货
文章标签对象

一、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
}

从map到对象的转换

二、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转换为对象。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)