1.BeanUtils提供对Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。我们在项目中经常使用到的PO对象和VO对象在很多情况下属性是相同的,通过BeanUtils.copyProperties()
方法可以减少程序员再次get/set方法的书写,BeanUtils.copyProperties()方法也有它的优缺点,下面我们通过程序来验证。
2.首先我们创建两个类:Studen.java和StudentVo.java两个类
Student.java
package my.test;
public class Student {
private Integer id;
private String sName;
private String sPwd;
private String sAddress;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public String getsPwd() {
return sPwd;
}
public void setsPwd(String sPwd) {
this.sPwd = sPwd;
}
public String getsAddress() {
return sAddress;
}
public void setsAddress(String sAddress) {
this.sAddress = sAddress;
}
}
StudentVo.java
package my.test;
public class StudentVo {
private Integer id;
private String sName;
private String sPwd;
private String sAddress;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public String getsPwd() {
return sPwd;
}
public void setsPwd(String sPwd) {
this.sPwd = sPwd;
}
public String getsAddress() {
return sAddress;
}
public void setsAddress(String sAddress) {
this.sAddress = sAddress;
}
}
可以看出这两个类的属性相同
Test.java
package my.test;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.BeanUtils;
public class Test {
public static void main(String[] args){
Student stu = new Student();
stu.setId(2);
stu.setsName("zhangsan");
stu.setsAddress("Shanghai");
stu.setsPwd("qweasd");
StudentVo stuVo = new StudentVo();
Long start = System.currentTimeMillis();
stuVo.setId(stu.getId());
stuVo.setsName(stu.getsName());
stuVo.setsPwd(stu.getsPwd());
stuVo.setsAddress(stu.getsAddress());
Long end = System.currentTimeMillis();
Long time2 = end - start;
System.out.println("使用Get/Set方法的结果:");
System.out.println(time2 + "ms");
System.out.println(stuVo.getId());
System.out.println(stuVo.getsName());
System.out.println(stuVo.getsPwd());
System.out.println(stuVo.getsAddress());
System.out.println("----------------------");
Long time1 = useCoryProperties(stuVo, stu);
System.out.println("使用BeanUtils.copyProperties()方法的结果:");
System.out.println(time1 + "ms");
System.out.println(stuVo.getId());
System.out.println(stuVo.getsName());
System.out.println(stuVo.getsPwd());
System.out.println(stuVo.getsAddress());
// System.out.println(stuVo.getDate());
}
private static Long useCoryProperties(Object a, Object b){
Long start = System.currentTimeMillis();
try {
BeanUtils.copyProperties(a, b);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Long end = System.currentTimeMillis();
return end - start;
}
}
输出结果:
使用Get/Set方法的结果:
0ms
2
zhangsan
qweasd
Shanghai
----------------------
使用BeanUtils.copyProperties()方法的结果:
93ms
2
zhangsan
qweasd
通过结果我们可以看出BeanUtils.copyProperties()方法可以很好的对Student类的属性进行copy,同时也把其中set的值获取到了。
但是我们看到效率比较低,使用get/set方法基本上没有消耗时间的,但是使用了BeanUtils.copyProperties()方法的耗时却达到了
99ms,这仅仅设置了几个属性,可以得知当属性的数量越来越多时消耗的时间就会变大;但是却省去了人工操作。
3.BeanUtils.copyProperties()方法的限制
只有当两个类的属性相同才会进行处理,对不同属性的不做处理;对java.util.Date类不支持,但是对java.sql.Date支持;对Integer,Boolean,Long类型不支持,
默认值为null,但是使用方法后默认值为0,所以要小心使用。使用的效率也比较低,所以要谨慎使用。当两个类在一起此方法不用,如下情况 class StudentVo{
.....
}
class Student{
.....
}
public class Test {
public static void main(String[] args) {
......
}
}
4.需要的jar包
commons-beanutils-*.jar
commons-logging-*.jar