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 blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}Long end = System.currentTimeMillis();return end - start;}}
输出结果:
使用Get/Set方法的结果:0ms2zhangsanqweasdShanghai----------------------使用BeanUtils.copyProperties()方法的结果:93ms2zhangsanqweasd
通过结果我们可以看出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