BeanUtils.copyProperties用法

开发中经常遇到,把父类的属性拷贝到子类中,或是将两个有重复属性的类互相拷贝。通常有2种方法:

  • 一个一个set
  • 用BeanUtils.copyProperties

很显然BeanUtils更加方便,也美观很多。

BeanUtils是深拷贝,还是浅拷贝?

BeanUtils.copyProperties是浅拷贝。

  • 浅拷贝:只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
  • 浅拷贝对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值
    浅拷贝对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址

  • 深拷贝:将子对象的属性也拷贝过去。
  • 深拷贝就是将目标对象的属性全部复制一份给源对象,复制完之后他们就是隔开的,没有任何关系,无论操作源对象还是目标对象都对另一个没有影响

    无论是浅拷贝还是深拷贝,对于基本类型和String来说都是没有影响的,有影响的只有引用类型数据

什么情况适合用BeanUtils:

如果都是单一的属性,那么不涉及到深拷贝的问题,适合用BeanUtils。

案例:

@Data
public class User {
    private String id;
    private String name;
    private String age;
    private String account;
    private String password;
}
@Data
public class Person {
    private String id;
    private String name;
    private String age;
    private String sex;
}
public class Test {
    public static void main(String[] args) {
        User user = new User();
        user.setId("1");
        user.setAge("2");
        user.setName("wzh");
        user.setAccount("wangzh");
        user.setPassword("1111");
        Person person = new Person();
        BeanUtils.copyProperties(user,person);
    }
}

结果:

Person(id=1, name=wzh, age=2, sex=null)

        通过上述测试我们就可以总结出相关结论,BeanUtils.copyProperties相当于把源对象source的属性值赋给目标对象target中与源对象source的中有着同属性名的属性,如上述案例中Person作为目标对象与源对象User中有着共同的同名属性id,name,age,所以person中的这三个字段被赋值成功,赋值的数据来源正是user对象,sex这个字段是Person类所特有的,所以不会被赋值,同时还要特别注意赋值操作相关类的属性一定要有对应的setter/getter,即

  • 源对象source的属性拷贝值赋给目标对象target的过程中,属性名和属性类型都相同的属性才能被成功拷贝赋值,例如id,name,age这三个目标对象的属性被赋值成功,目标对象中的sex属性,由于源对象中没有同名的属性所以没法被赋值成功。
  • 做赋值的属性一定要有对应的setter/getter才能成功赋值

你可能感兴趣的:(java,开发语言)