版本说明
- commons-beanutils:1.9.3
- fastjson:1.2.58
场景
使用BeanUtils.copyProperties()拷贝Map/JSONObject时,无法正常拷贝属性类型为枚举或POJO。此时,需要使用ConvertUtils注册一个自定义的转换类。
实验
实验准备:
- Student类(拷贝对象),Student中有三个属性name/sex/grade分别为String/enum/POJO类型(包含属性比较方法propertiesEquals());
- Sex类,枚举类型,定义了FEMAL/MALE;
- Grade类,简单对象,包含三个属性。
定义如下:
/**
* 学生类,属性中有一个枚举类型、一个POJO。
*
* @author zengguang
*
*/
public class Student {
/**
* 姓名
*/
private String name;
/**
* 性别,enum
*/
private Sex sex;
/**
* 成绩,POJO
*/
private Grade grade;
public Student() {
}
public Student(String name, Sex sex, Grade grade) {
this.name = name;
this.sex = sex;
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Sex getSex() {
return sex;
}
public void setSex(Sex sex) {
this.sex = sex;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
}
/**
* 成绩。
*
* @author zengguang
*
*/
public class Grade {
private Integer mathematics;
private Integer chinese;
private Integer english;
public Grade() {
}
public Grade(Integer mathematics, Integer chinese, Integer english) {
super();
this.mathematics = mathematics;
this.chinese = chinese;
this.english = english;
}
public Integer getMathematics() {
return mathematics;
}
public void setMathematics(Integer mathematics) {
this.mathematics = mathematics;
}
public Integer getChinese() {
return chinese;
}
public void setChinese(Integer chinese) {
this.chinese = chinese;
}
public Integer getEnglish() {
return english;
}
public void setEnglish(Integer english) {
this.english = english;
}
}
/**
* 枚举类,性别。
*
* @author zengguang
*
*/
public enum Sex {
MALE, FEMAL;
}
实验对比
- Java对象之间的拷贝
- BeanMap拷贝到Java对象
- JSONObject对象拷贝到Java对象
- HashMap对象拷贝到Java对象
测试代码
Grade g = new Grade(100, 99, 98);
Student origBean = new Student("小明", Sex.MALE, g);
Student destBean = new Student();
// JavaBean → JavaBean
try {
BeanUtils.copyProperties(destBean, origBean);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
validate(destBean, origBean, "JavaBean → JavaBean");
// BeanMap → JavaBean BeanMap/BeanUtils同为beanutils包中的类
BeanMap destBeanMap = new BeanMap(origBean);
try {
BeanUtils.copyProperties(destBean, destBeanMap);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
validate(destBeanMap, origBean, "BeanMap → JavaBean");
// Map → JavaBean
String json = JSONObject.toJSONString(origBean);
JSONObject obj = JSONObject.parseObject