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

Java BeanUtils 类详解:作用、语法与示例

一、BeanUtils 的核心作用

BeanUtils 是 Apache Commons 和 Spring Framework 提供的工具类,主要用于简化 JavaBean 的操作。核心功能包括:

  1. 属性拷贝:对象间同名属性自动复制
  2. 动态访问:通过字符串名称操作属性
  3. 类型转换:自动处理不同类型间的转换
  4. 嵌套访问:支持 address.city 格式的链式访问

📌 JavaBean 定义:符合规范的 POJO 类

  • 有无参构造函数
  • 属性私有化
  • 提供 getter/setter 方法

二、Apache Commons BeanUtils

核心方法
方法作用示例
copyProperties(dest, orig)复制同名属性BeanUtils.copyProperties(userDTO, user);
getProperty(bean, name)获取属性值String name = BeanUtils.getProperty(user, "name");
setProperty(bean, name, value)设置属性值BeanUtils.setProperty(user, "age", "30");
describe(bean)对象转 MapMap<String, String> map = BeanUtils.describe(user);
populate(bean, properties)Map 转对象BeanUtils.populate(user, map);

 使用示例

// 添加依赖
// <dependency>
//     <groupId>commons-beanutils</groupId>
//     <artifactId>commons-beanutils</artifactId>
//     <version>1.9.4</version>
// </dependency>import org.apache.commons.beanutils.BeanUtils;public class CommonsExample {public static void main(String[] args) throws Exception {// 1. 创建源对象User source = new User("Alice", 25, new Address("New York"));// 2. 创建目标对象UserDTO target = new UserDTO();// 3. 属性拷贝(同名属性自动复制)BeanUtils.copyProperties(target, source);System.out.println(target); // 输出: UserDTO{name='Alice', age=25, city='New York'}// 4. 动态获取属性String city = BeanUtils.getProperty(source, "address.city");System.out.println(city); // 输出: New York// 5. 动态设置属性BeanUtils.setProperty(target, "age", "30"); // 字符串自动转int// 6. 对象转MapMap<String, String> map = BeanUtils.describe(source);System.out.println(map); // {name=Alice, age=25, address=Address[city=New York]}// 7. Map转对象Map<String, Object> data = new HashMap<>();data.put("name", "Bob");data.put("age", "35"); // 字符串自动转换data.put("address.city", "London"); // 嵌套属性User newUser = new User();BeanUtils.populate(newUser, data);System.out.println(newUser.getAddress().getCity()); // 输出: London}
}// JavaBean 类
class User {private String name;private int age;private Address address;// 无参构造器、getter/setter 省略
}class UserDTO {private String name;private int age;private String city; // 对应 address.city// 无参构造器、getter/setter 省略
}class Address {private String city;// 构造器、getter/setter 省略
}

 

 

三、Spring BeanUtils

核心方法(更简洁高效)
方法作用特点
copyProperties(source, target)属性复制无类型转换,性能更好
copyProperties(source, target, ignoreProperties)带忽略属性的复制跳过指定属性

 

 使用示例

// 添加依赖
// <dependency>
//     <groupId>org.springframework</groupId>
//     <artifactId>spring-beans</artifactId>
//     <version>5.3.20</version>
// </dependency>import org.springframework.beans.BeanUtils;public class SpringExample {public static void main(String[] args) {User source = new User("Alice", 25, new Address("New York"));UserDTO target = new UserDTO();// 1. 基础属性复制BeanUtils.copyProperties(source, target);System.out.println(target.getCity()); // 输出: null (不自动处理嵌套)// 2. 带忽略属性的复制BeanUtils.copyProperties(source, target, "age"); // 忽略age属性System.out.println(target.getAge()); // 输出: 0 (默认值)// 3. 自定义属性处理器class CustomConverter implements Converter {public Object convert(Class type, Object value) {if(value instanceof User) {return ((User) value).getAddress().getCity();}return null;}}// 4. 处理嵌套属性(需自定义)String city = (String) new CustomConverter().convert(String.class, source);target.setCity(city);System.out.println(target.getCity()); // 输出: New York}
}

 

四、最佳实践与注意事项

1. 选择指南
场景推荐工具
需要类型转换Apache BeanUtils
高性能场景Spring BeanUtils
嵌套属性访问Apache BeanUtils
简单属性复制Spring BeanUtils
2. 性能对比
3. 常见问题解决

问题1:嵌套属性复制失败

// Apache 解决方案
BeanUtils.setProperty(target, "address.city", "Paris");// Spring 解决方案(需自定义)
class AddressMapper {public static void map(User source, UserDTO target) {target.setCity(source.getAddress().getCity());}
}

问题2:类型转换错误

// 注册自定义转换器
ConvertUtils.register(new Converter() {public Object convert(Class type, Object value) {return LocalDate.parse(value.toString());}
}, LocalDate.class);// 现在可以处理字符串转LocalDate
BeanUtils.setProperty(target, "birthDate", "2023-01-01");

问题3:忽略特定属性

// Spring 方式
BeanUtils.copyProperties(source, target, "password", "sensitiveData");// Apache 方式(需额外处理)
Map<String, String> map = BeanUtils.describe(source);
map.remove("password");
BeanUtils.populate(target, map);

五、实际应用场景

场景1:DTO/VO 转换
// Controller层
public UserDTO getUser(Long id) {User user = userService.findById(id);UserDTO dto = new UserDTO();BeanUtils.copyProperties(user, dto);return dto;
}
场景2:表单对象绑定
// 接收表单提交
public String createUser(@ModelAttribute UserForm form) {User user = new User();BeanUtils.copyProperties(form, user);userService.save(user);return "redirect:/users";
}
场景3:动态配置注入
// 从配置文件中读取设置
@Value("${app.settings}")
private Map<String, String> settings;public void applySettings() {AppConfig config = new AppConfig();BeanUtils.populate(config, settings);
}
场景4:对象合并
public User mergeUserChanges(User original, User changes) {User merged = new User();BeanUtils.copyProperties(original, merged); // 复制原始数据BeanUtils.copyProperties(changes, merged);  // 覆盖变更数据return merged;
}

总结:BeanUtils 作用

  1. 消除样板代码:减少 getter/setter 调用
  2. 提升开发效率:简化对象操作
  3. 增强灵活性:支持动态属性访问
  4. 降低耦合度:解耦对象操作逻辑
http://www.dtcms.com/a/299957.html

相关文章:

  • springboot 基于签名的安全通信
  • 深入解析YARN中的FairScheduler与CapacityScheduler:资源分配策略的核心区别
  • Aerospike Java客户端进阶:对象映射与Spring Data集成实战
  • spring Could 高频面试题
  • 【科普】java和html和lvgl生成页面有什么区别,还有什么方法可以生成?
  • 数据库HB OB mysql ck startrocks, ES存储特点,以及应用场景
  • 通过服务启动应用的流程(类似SystemUi启动流程)
  • Linux笔记5——常用命令-4
  • 深入浅出学习 KNN 算法:从原理到数字识别实践
  • 【Linux庖丁解牛】— 日志进程池 !
  • 大模型系列——Dify:知识库与外部知识库
  • SSH连接失败排查与解决教程: Connection refused
  • PromQL完全指南:掌握Prometheus核心查询语言
  • Ubuntu 22.04 配置 Zsh + Oh My Zsh + Powerlevel10k
  • 二十八、【Linux系统域名解析】DNS安装、子域授权、缓存DNS、分离解析、多域名解析
  • C++___快速入门(上)
  • 人工智能之数学基础:概率论之韦恩图的应用
  • WebAPIs里的filter
  • Android 编码规范全指南
  • 驱动-设备树-基本语法
  • Python爬虫实战:诗词名句网《三国演义》全集
  • 服务器:数字世界的隐形引擎
  • 《基于雅可比矢量近似的EIT触觉传感灵敏度非均匀校正》论文解读
  • ESP32实战:5分钟实现PC远程控制LED灯
  • C++类和对象(三)
  • IC测试之pogo pin学习与总结-20250726
  • 进制定义与转换详解
  • 1.Java发展简史与设计哲学
  • 最优估计准则与方法(5)加权最小二乘估计(WLS)_学习笔记
  • 360° 外壁镜头:小物体环外侧检测的创新突破