1.两个包下BeanUtils.copyProperties对比
BeanUtils工具类主要通过导入org.springframework.beans.BeanUtils或者org.apache.commons.beanutils.BeanUtils包来获取,但是不同包中BeanUtils的方法是不一样的,让我们通过实例看看这两者的不同之处吧。
先来看一下这两个包中的copyProperties方法的定义:
//org.springframework.beans.BeanUtils
public static void copyProperties(Object source, Object target){....}//org.apache.commons.beanutils.BeanUtils
public static void copyProperties(Object dest,Object orig){....}
org.springframework.beans.BeanUtils:
spring框架中的BeanUtils类提供的copyProperties方法,用于将源对象的属性值复制到目标对象中:
- source:源对象,即属性值将被复制的对象。
- target:目标对象,即接收源对象属性值的对象
这个方法会检查源对象和目标对象的属性名是否匹配,是否有getter和setter方法(含有@Data也可以)。如果匹配,将源对象中非空属性更新到目标对象中。
需要注意spring提供的BeanUtils不会自动处理类型转换。如果属性类型(比如:String)不对应将会抛出异常。
@Data
public class Student {private String id;private String name;private String age;}@Data
public class Teacher {private String id;private String name;}
接下来看一下实例:
public static void main(String[] args) throws Exception {Student student = new Student("123", "zhangsan", "19");Teacher teacher = new Teacher("12334","lisi");System.out.println(student.toString());BeanUtils.copyProperties(student,teacher);System.out.println(teacher.toString());}
使用org.springframework.beans.BeanUtils下的copyProperties方法,执行结果如下:
原始数据:Student(id=123 name=zhangsan, age=19)
原始数据:Teacher(id=12334, name=zhangsan)
结果:Teacher(id=123, name=zhangsan)
小类更新大类:
BeanUtils.copyProperties(teacher,student); // 其他保持不变
原始数据:Student(id=123 name=zhangsan, age=19)
原始数据:Teacher(id=12334, name=zhangsan)
结果:Student(id=12334, name=zhangsan, age=19)
org.apache.commons.beanutils.BeanUtils
Apache Commons BeanUtils 库中的 BeanUtils
类也提供了 copyProperties
方法,其功能与 Spring 的类似,但签名稍有不同:
//org.apache.commons.beanutils.BeanUtilspublic static void copyProperties(Object dest,Object orig){....}
- dest:目标对象,即接收属性值的对象。
- orig:源对象,即属性值将被复制的对象。
与 Spring 的
BeanUtils
类似,Apache Commons 的BeanUtils
也会检查源对象和目标对象的属性名是否匹配,并且是否有相应的 getter 和 setter 方法。如果匹配,属性值将被从源对象复制到目标对象。Apache Commons BeanUtils 的一个显著特点是它尝试自动处理类型转换。
如果找不到合适的转换器,它可能会抛出异常。
接下来看一下实例:
public static void main(String[] args) throws Exception {Student student = new Student("123", "zhangsan", "19");Teacher teacher = new Teacher("12334","lisi");System.out.println(student.toString());BeanUtils.copyProperties(teacher,student);System.out.println(teacher.toString());}
BeanUtils.copyProperties(teacher,student); // 注意此时参数位置
执行结果如下:
原始数据:Student(id=123, name=zhangsan, age=19)
原始数据:Teacher(id=12334, name=lisi)结果:Teacher(id=123, name=zhangsan)
注意:如果使用这个包想将小类(字段没有全部包含)更新大类,我测试结果是没有反应的,也就是说保持原样(可以实操一下)
public static void main(String[] args) throws Exception {Student student = new Student("123", "zhangsan", "19");Teacher teacher = new Teacher("12334","lisi");System.out.println(student.toString());BeanUtils.copyProperties(student,teacher);System.out.println(student.toString());System.out.println(teacher.toString());}
原始数据:Student(id=123, name=zhangsan, age=19)
原始数据:Teacher(id=12334, name=lisi)结果:Student(id=123, name=zhangsan, age=19)
Teacher(id=12334, name=lisi)