首先两者来源于同一个包:
1
2
|
import
org.apache.commons.beanutils.BeanUtils;
import
org.apache.commons.beanutils.PropertyUtils;
|
千万不要导包错误,否者会报异常。
BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度。
以下是几点要求及说明:
1、 通过反射将一个对象的值赋值个另外一个对象(前提是对象中属性的名字相同)。
2、 BeanUtils.copyProperties(obj1,obj2); 经常闹混不知道是谁给谁赋值,无意中先到"后付前"这个词来帮助自己记忆这个功能。即将obj2的值赋值给obj1。
3、 如果2中实例obj2为空对象,即值new了他的实例并没有赋值的话obj1对应的属性值也会被设置为空置。
4、BeanUtils与PropertyUtils对比(这里对比copyProperties方法)
PropertyUtils的copyProperties()方法几乎与BeanUtils.copyProperties()相同,主要的区别在于后者提供类型转换功能,即发现两个JavaBean的同名属性为不同类型时,在支持的数据类型范围内进行转换,PropertyUtils不支持这个功能,所以说BeanUtils速度会更快一些,使用更普遍一点,犯错的风险更低一点。
举个例子:创建两个对象,然后 给一个对象赋值 最后把已经赋值的对象 copy到另一个空对象里面
首先创建Person对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public
class
Person {
private
String name;
private
String sex;
private
int
age;
private
Date birthday;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getSex() {
return
sex;
}
public
void
setSex(String sex) {
this
.sex = sex;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
public
Date getBirthday() {
return
birthday;
}
public
void
setBirthday(Date birthday) {
this
.birthday = birthday;
}
}
|
然后 创建Student 对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
public
class
Student {
private
String name;
private
String sex;
private
Integer age;
private
Date birthday;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
String getSex() {
return
sex;
}
public
void
setSex(String sex) {
this
.sex = sex;
}
public
Integer getAge() {
return
age;
}
public
void
setAge(Integer age) {
this
.age = age;
}
public
Date getBirthday() {
return
birthday;
}
public
void
setBirthday(Date birthday) {
this
.birthday = birthday;
}
@Override
public
String toString() {
return
"Student{"
+
"name='"
+ name + '\
''
+
", sex='"
+ sex + '\
''
+
", age="
+ age +
", birthday="
+ birthday +
'}'
;
}
}
|
然后创建测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
class
Test {
public
static
void
main(String[] args)
throws
Exception{
Student student=
new
Student();
Person person =
new
Person();
person.setAge(
23
);
person.setName(
"zhangsan"
);
person.setSex(
"nan"
);
person.setBirthday(
new
Date());
//PropertyUtils.copyProperties(student, person);
BeanUtils.copyProperties(student, person);
System.out.println(student.toString());
}
}
|
执行以上方法会打印出:
1
|
Student{name=
'zhangsan'
, sex=
'nan'
, age=
23
, birthday=Thu Nov
24
10
:
32
:
10
CST
20
|
在执行 BeanUtils.copyProperties(student, person)时 如果把student对象的age 类型换成 String 也是可以打印出正常的结果。但是PropertyUtils.copyProperties(student, person)就会抛出异常。