Home 利用BeanUtils在对象间复制属性
Post
Cancel

利用BeanUtils在对象间复制属性

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

1
2
3
4
5
6
7
8
9
10
11
12
// 得到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.save(teacher);

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

1
2
3
4
5
6
7
8
// 得到TeacherForm
TeacherForm teacherForm = (TeacherForm) form;
// 构造Teacher对象
Teacher teacher = new Teacher();
// 赋值
BeanUtils.copyProperties(teacher, teacherForm);
// 持久化Teacher对象到数据库
HibernateDAO.save(teacher);

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

1
teacher.setModifyDate(new Date());

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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异常。

This post is licensed under CC BY 4.0 by the author.