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

 更新时间:2025年08月14日 11:04:13   作者:我爱Jack  
BeanUtils是Apache Commons和Spring Framework提供的工具类,主要用于简化JavaBean的操作,接下来通过本文给大家介绍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. 对象转Map
        Map<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. 降低耦合度:解耦对象操作逻辑

相关文章

  • java实现Xml与json之间的相互转换操作示例

    java实现Xml与json之间的相互转换操作示例

    这篇文章主要介绍了java实现Xml与json之间的相互转换操作,结合实例形式分析了Java xml与json相互转换工具类的定义与使用相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • Java实现4种微信抢红包算法(小结)

    Java实现4种微信抢红包算法(小结)

    微信红包是大家经常使用的,到现在为止仍然有很多红包开发的需求,实现抢红包算法也是面试常考题,本文就详细的来介绍一下如何实现,感兴趣的可以了解一下
    2021-12-12
  • 利用javadoc注释自动生成Swagger注解

    利用javadoc注释自动生成Swagger注解

    由于现在controller方法上面没有swagger注解,只能拿到接口url地址,无法获得接口功能描述,所以本文为大家介绍一下如何利用javadoc注释自动生成Swagger注解,感兴趣的可以了解下
    2023-08-08
  • SpringMVC访问静态资源的方法

    SpringMVC访问静态资源的方法

    本篇文章主要介绍了SpringMVC访问静态资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java中Final关键字的使用技巧及其性能优势详解

    Java中Final关键字的使用技巧及其性能优势详解

    这篇文章主要介绍了Java中Final关键字的使用技巧及其性能优势详解,Java中的final关键字用于修饰变量、方法和类,可以让它们在定义后不可更改,从而提高程序的稳定性和可靠性,此外,final关键字还有一些使用技巧和性能优势,需要的朋友可以参考下
    2023-10-10
  • RabbitMQ Stream插件使用案例代码

    RabbitMQ Stream插件使用案例代码

    这篇文章主要介绍了RabbitMQ Stream插件使用案例代码,2.4版为RabbitMQ流插件引入了对RabbitMQStream插件Java客户端的初始支持,需要的朋友可以参考下
    2024-04-04
  • 浅谈Java中ArrayList的扩容机制

    浅谈Java中ArrayList的扩容机制

    本文主要介绍了浅谈Java中ArrayList的扩容机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java如何取掉json数据中值为null的属性字段

    Java如何取掉json数据中值为null的属性字段

    这篇文章主要介绍了Java如何取掉json数据中值为null的属性字段,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java API操作Hdfs的示例详解

    Java API操作Hdfs的示例详解

    这篇文章主要介绍了Java API操作Hdfs详细示例,遍历当前目录下所有文件与文件夹,可以使用listStatus方法实现上述需求,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • java 抛出异常处理的方法

    java 抛出异常处理的方法

    这篇文章主要介绍了java 抛出异常处理的方法的相关资料,throws关键字通常被应用在声明方法时,用来指定可能抛出的异常,这里就讲下如何使用,需要的朋友可以参考下
    2017-08-08

最新评论