当前位置: 首页 > news >正文

Hutool的`BeanUtil.toBean`方法详解

BeanUtil.toBean是Hutool工具包中一个非常实用的JavaBean转换工具方法,它能够方便地将一个对象(通常是Map或另一个JavaBean)转换为目标类型的JavaBean实例。

方法签名

public static <T> T toBean(Object source, Class<T> targetClass)

功能说明

  1. 对象转换:将源对象(source)转换为目标类型(targetClass)的实例
  2. 自动属性拷贝:自动匹配源对象和目标对象的属性名进行值拷贝
  3. 支持多种源类型
    • 另一个JavaBean对象
    • Map对象(键对应属性名)
    • 带有getter方法的任意对象

使用示例

基本用法

// 从Map创建Bean
Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("age", 25);User user = BeanUtil.toBean(map, User.class);
System.out.println(user.getName()); // 输出: 张三

对象转换

// 从源对象创建目标对象
SourceBean source = new SourceBean();
source.setName("李四");
source.setValue(100);TargetBean target = BeanUtil.toBean(source, TargetBean.class);
System.out.println(target.getName()); // 输出: 李四

高级特性

1. 属性名称映射

当属性名不一致时,可以使用@Alias注解指定映射关系:

public class User {@Alias("userName")private String name;// getter/setter...
}Map<String, Object> map = new HashMap<>();
map.put("userName", "王五");User user = BeanUtil.toBean(map, User.class);
System.out.println(user.getName()); // 输出: 王五

2. 忽略属性

使用@PropIgnore注解可以忽略某些属性:

public class User {private String name;@PropIgnoreprivate String password;// getter/setter...
}

3. 类型自动转换

Hutool会自动进行基本类型和常用类型的转换:

Map<String, Object> map = new HashMap<>();
map.put("age", "30"); // 字符串形式的数字User user = BeanUtil.toBean(map, User.class);
System.out.println(user.getAge()); // 输出: 30 (int类型)

与类似工具的比较

特性Hutool的BeanUtilApache BeanUtilsSpring BeanUtils
性能
类型转换能力一般一般
注解支持支持不支持不支持
依赖Hutool核心Commons BeanUtilsSpring Core

实现原理

  1. 通过反射获取目标类的所有字段
  2. 根据字段名从源对象获取对应值
  3. 进行必要的类型转换
  4. 通过反射设置目标对象的字段值

注意事项

  1. 目标类需要有无参构造函数,否则会抛出异常
  2. 对于复杂嵌套对象,可能需要递归处理
  3. 性能考虑:在极高性能要求的场景,可以考虑缓存反射信息
  4. 安全性:确保源数据可信,避免通过反射注入不安全数据

最佳实践

// 1. 批量转换
List<Map<String, Object>> mapList = ...;
List<User> userList = mapList.stream().map(map -> BeanUtil.toBean(map, User.class)).collect(Collectors.toList());// 2. 自定义转换器
CopyOptions options = CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true).setFieldValueEditor((fieldName, value) -> {// 自定义值处理if("name".equals(fieldName)) {return ((String)value).trim();}return value;});User user = BeanUtil.toBean(map, User.class, options);

总结

Hutool的BeanUtil.toBean方法是一个非常便捷的对象转换工具,特别适合在以下场景使用:

  • DTO和Entity之间的转换
  • Map到JavaBean的转换
  • 对象浅拷贝
  • 快速原型开发

它通过简化反射操作,提供类型自动转换和灵活的配置选项,大大提高了Java开发中对象转换的效率和代码可读性。

http://www.xdnf.cn/news/339391.html

相关文章:

  • Navee滑板车强势登陆中国,以智能科技重塑城市出行新风尚
  • 使用 Cesium 构建 3D 地图应用的实践
  • C++ 算法学习之旅:从入门到精通的秘籍
  • AWS之存储服务
  • 蓝桥杯FPGA赛道第二次模拟题代码
  • 如何从播放器构造角度研究 Media3 源码
  • 六、Hadoop初始化与启动
  • KAXA凯莎科技AGV通信方案如何赋能智能仓储高效运作?
  • 数据结构--红黑树
  • XML简单介绍
  • IBM BAW(原BPM升级版)使用教程第五讲
  • MyBatis 动态 SQL 详细指南【完整示例】
  • Python+ffmpeg 实现给视频添加字幕
  • Android ImageView 加载 Base64编码图片
  • vscode如何使用 GitHub Copilot
  • Windows ABBYY FineReader 16 Corporate 文档转换、PDF编辑和文档比较
  • 文件操作和IO(下)
  • 基础编程题目集 6-8 简单阶乘计算
  • 【Rust错误处理】Rust错误处理机制详解与应用实战
  • Go:简洁高效,构建现代应用的利器
  • 按摩椅的机芯类型和材质
  • 数字化驱动下的智慧物流与零售创新:全流程无人仓与定制开发开源AI智能名片S2B2C商城小程序的协同实践
  • 大模型(LLMs)推理面
  • android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘
  • python读写json文件
  • 手撕基于AMQP协议的简易消息队列-7(客户端模块的编写)
  • 数字孪生技术中端渲染与流渲染的架构对比
  • linux中的常用命令(一)
  • STM32智能刷卡消费系统(uC/OS-III)
  • commonmark.js 源码阅读(一) - Block Parser