BeanUtils

介绍如何使用commons-beanutils中的BeanUtils简化JavaBean属性复制过程,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用BeanUtils在对象间复制属性

commons-beanutils是jakarta commons子项目中的一个软件包,其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度(什么,你的薪水按代码行数计算?那千万别让老板看到此帖哦)

BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法。该方法定义如下:

public static void copyProperties(java.lang.Object dest,java.lang.Object orig)
  throws java.lang.IllegalAccessException,
         java.lang.reflect.InvocationTargetException

如果你有两个具有很多相同属性的JavaBean,一个很常见的情况就是Struts里的PO对象(持久对象)和对应的ActionForm,例如Teacher和TeacherForm。我们一般会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似下面的语句对属性逐个赋值:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment());

//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代码就大大改观了,如下所示:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

如果Teacher和TeacherForm间存在名称不相同的属性,则BeanUtils不对这些属性进行处理,需要程序员手动处理。例如Teacher包含modifyDate(该属性记录最后修改日期,不需要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());

怎么样,很方便吧!除BeanUtils外还有一个名为PropertyUtils的工具类,它也提供copyProperties()方法,作用与BeanUtils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。BeanUtils支持的转换类型如下:

  • java.lang.BigDecimal
  • java.lang.BigInteger
  • boolean and java.lang.Boolean
  • byte and java.lang.Byte
  • char and java.lang.Character
  • java.lang.Class
  • double and java.lang.Double
  • float and java.lang.Float
  • int and java.lang.Integer
  • long and java.lang.Long
  • short and java.lang.Short
  • java.lang.String
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

这里要注意一点,java.util.Date是不被支持的,而它的子类java.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Date类型。否则在转换时会提示argument mistype异常。

本文地址:http://www.cnblogs.com/bjzhanghao/archive/2004/07/30/28607.html

### Apache Commons BeanUtils 使用方法与示例 #### 1. 添加依赖 为了使用 `BeanUtils`,需要先引入 Apache Commons BeanUtils 库。如果项目基于 Maven 构建,则可以通过修改 `pom.xml` 文件添加以下依赖[^2]: ```xml <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> ``` 对于非 Maven 项目,可以从官方仓库下载 JAR 包并手动将其加入项目的类路径。 --- #### 2. 基本功能介绍 `BeanUtils` 提供了一系列静态方法来简化 JavaBeans 属性的操作,主要包括以下几个方面: - **属性复制 (`copyProperties`)**:将源对象的属性值复制到目标对象。 - **属性设置 (`setProperty`)**:动态设置指定名称的属性值。 - **属性获取 (`getProperty`)**:动态获取指定名称的属性值。 - **批量操作**:支持对多个属性进行统一处理。 以下是具体的功能实现和代码示例。 --- #### 3. 示例代码 ##### (1)属性复制 (`copyProperties`) 此方法可以将一个对象的属性值复制到另一个具有相同属性的对象中。假设我们有两个类 `Source` 和 `Target`,它们拥有相同的字段结构。 ```java import org.apache.commons.beanutils.BeanUtils; class Source { private String name; private int age; // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Target { private String name; private int age; // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class CopyPropertiesExample { public static void main(String[] args) throws Exception { Source source = new Source(); source.setName("John"); source.setAge(30); Target target = new Target(); // 复制属性 BeanUtils.copyProperties(target, source); System.out.println("Name: " + target.getName()); // 输出 John System.out.println("Age: " + target.getAge()); // 输出 30 } } ``` 以上代码展示了如何利用 `BeanUtils.copyProperties` 方法完成两个对象之间的属性同步[^3]。 --- ##### (2)动态设置属性值 (`setProperty`) 该方法允许通过字符串形式的键名动态设置对象的某个属性值。 ```java import org.apache.commons.beanutils.BeanUtils; class Person { private String firstName; private String lastName; // Getters and Setters public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } public class SetPropertyExample { public static void main(String[] args) throws Exception { Person person = new Person(); // 动态设置属性值 BeanUtils.setProperty(person, "firstName", "Alice"); BeanUtils.setProperty(person, "lastName", "Smith"); System.out.println("First Name: " + person.getFirstName()); // 输出 Alice System.out.println("Last Name: " + person.getLastName()); // 输出 Smith } } ``` 上述代码片段说明了如何通过反射机制调用 setter 方法为对象赋值[^4]。 --- ##### (3)动态获取属性值 (`getProperty`) 类似于 `setProperty`,也可以通过 `getProperty` 获取对象的特定属性值。 ```java import org.apache.commons.beanutils.BeanUtils; class Product { private double price; // Getter and Setter public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } } public class GetPropertyExample { public static void main(String[] args) throws Exception { Product product = new Product(); product.setPrice(19.99); // 动态获取属性值 String result = BeanUtils.getProperty(product, "price"); System.out.println("Product Price: " + result); // 输出 19.99 } } ``` 此处展示的是如何提取对象内部的数据而无需显式调用 getter 方法。 --- #### 4. 注意事项 - 如果源对象和目标对象之间存在不匹配的属性(如类型不同),可能会抛出异常。 - 对于复杂类型的嵌套属性访问,需确保中间层已初始化,否则会引发 NullPointerException。 - 需要捕获可能发生的 `IllegalAccessException` 或 `InvocationTargetException` 异常。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值