以前将Struts中的ActionForm的属性Copy到对应的Hibernate 实体类时,我用的是BeanUtils,觉得其功能还可以,前几天学习cglib时发现它也有个bean copy的功能,所以想将他们两的性能作个比较,就写了一个较简单的测试用例,不比不知道,一比吓一跳,看来cglib的表现确实不凡呀
package com.redbeans.test;
import java.lang.reflect.InvocationTargetException;
import junit.framework.TestCase;
import net.sf.cglib.beans.BeanCopier;
import org.apache.commons.beanutils.BeanUtils;
public class BeanCopyTest extends TestCase {
class Bean01 {
/** identifier field */
private long personId;
/** persistent field */
private String username;
/** persistent field */
private String password;
/** nullable persistent field */
private String gender;
/** nullable persistent field */
private String email;
/** nullable persistent field */
private String address;
/** nullable persistent field */
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
class Bean02 {
/** identifier field */
private long personId;
/** persistent field */
private String username;
/** persistent field */
private String password;
/** nullable persistent field */
private String realName;
/** nullable persistent field */
private String gender;
/** nullable persistent field */
private double height;
/** nullable persistent field */
private double weight;
/** nullable persistent field */
private int status;
/** nullable persistent field */
private String telephone;
/** nullable persistent field */
private String email;
/** nullable persistent field */
private String address;
/** nullable persistent field */
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
public void testCglib() {
Bean01 bean01 = new Bean01();
bean01.setAddress("test");
bean01.setUsername("bean01");
Bean02 bean02 = new Bean02();
for (int i = 0; i < 10000; i++) {
BeanCopier copier = BeanCopier.create(Bean01.class, Bean02.class,
false);
copier.copy(bean01, bean02, null);
}
}
public void testBeanUtils() {
Bean01 bean01 = new Bean01();
bean01.setAddress("test");
bean01.setUsername("bean01");
Bean02 bean02 = new Bean02();
for (int i = 0; i < 10000; i++) {
try {
BeanUtils.copyProperties(bean02, bean01);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.redbeans.test;
import java.lang.reflect.InvocationTargetException;
import junit.framework.TestCase;
import net.sf.cglib.beans.BeanCopier;
import org.apache.commons.beanutils.BeanUtils;
public class BeanCopyTest extends TestCase {
class Bean01 {
/** identifier field */
private long personId;
/** persistent field */
private String username;
/** persistent field */
private String password;
/** nullable persistent field */
private String gender;
/** nullable persistent field */
private String email;
/** nullable persistent field */
private String address;
/** nullable persistent field */
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
class Bean02 {
/** identifier field */
private long personId;
/** persistent field */
private String username;
/** persistent field */
private String password;
/** nullable persistent field */
private String realName;
/** nullable persistent field */
private String gender;
/** nullable persistent field */
private double height;
/** nullable persistent field */
private double weight;
/** nullable persistent field */
private int status;
/** nullable persistent field */
private String telephone;
/** nullable persistent field */
private String email;
/** nullable persistent field */
private String address;
/** nullable persistent field */
private String postcode;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getPostcode() {
return postcode;
}
public void setPostcode(String postcode) {
this.postcode = postcode;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
public void testCglib() {
Bean01 bean01 = new Bean01();
bean01.setAddress("test");
bean01.setUsername("bean01");
Bean02 bean02 = new Bean02();
for (int i = 0; i < 10000; i++) {
BeanCopier copier = BeanCopier.create(Bean01.class, Bean02.class,
false);
copier.copy(bean01, bean02, null);
}
}
public void testBeanUtils() {
Bean01 bean01 = new Bean01();
bean01.setAddress("test");
bean01.setUsername("bean01");
Bean02 bean02 = new Bean02();
for (int i = 0; i < 10000; i++) {
try {
BeanUtils.copyProperties(bean02, bean01);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}