一行代码完成两个属性相同的对象的值同步,免去所有的get set

一行代码完成两个属性相同的对象的值同步,免去所有的get set

START

如有Avo和Bvo两个属性相同但地址不同的对象,Avo有值,Bvo需要把Avo的值全部同步过来,重复的get set使我们崩溃,强大的Spring为我们提供了一个方法解决了这个问题,下面记录一下我的demo。

public class Avo {
    private String id;
    private String name;
    private String age;
    public String getId() {return id;}
    public void setId(String id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getAge() {return age;}
    public void setAge(String age) { this.age = age;}
}
public class Bvo {
    private String id;
    private String name;
    private String age;
    public String getId() {return id;}
    public void setId(String id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getAge() {return age;}
    public void setAge(String age) {this.age = age;}
    @Override
    public String toString() {
        return "Bvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

测试类:

public class test {
    public static void main(String[] args) {
    //一行代码完成两个属性相同的对象的值同步,免去所有的get set。
        Avo avo = new Avo();
        Bvo bvo = new Bvo();
        /**
         * 普通表层对象值同步
         * Avo与Bvo内的属性全部相同。
         * 给Avo初始化值,然后同步转换给Bvo,
         */
        avo.setId("0001");
        avo.setName("至尊宝");
        avo.setAge("500");
        BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo
        System.out.println("Bvo"+bvo);
}

执行结果:可以看出Avo的值以及全部同步给Bvo了。 

单纯的对象同步就这样了,下面再说说对象内还有对象的情况了。

一:对象内置对象(内对象相同):

public class Cvo {
    private String id;
    private String name;
    public String getId() { return id;}
    public void setId(String id) {this.id = id;}
    public String getName() {return name; }
    public void setName(String name) { this.name = name;}
    @Override
    public String toString() {
        return "Cvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
public class Avo {
    private String id;
    private String name;
    private String age;
    private Cvo cvo;//内置对象
    public String getId() {return id;}
    public void setId(String id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getAge() {return age;}
    public void setAge(String age) { this.age = age;}
    public Cvo getCvo() {return cvo;}
    public void setCvo(Cvo cvo) { this.cvo = cvo;}
}
public class Bvo {
    private String id;
    private String name;
    private String age;
    private Cvo cvo;//内置对象

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) {this.name = name;}
    public String getAge() { return age; }
    public void setAge(String age) {this.age = age;}

    public Cvo getCvo() { return cvo;}
    public void setCvo(Cvo cvo) { this.cvo = cvo; }
    @Override
    public String toString() {
        return "Bvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", cvo=" + cvo +
                '}';
    }
}

//Avo与Bvo内都有Cvo的情况

测试:

public class test {
    public static void main(String[] args) {
    //一行代码完成两个属性相同的对象的值同步,免去所有的get set。
        Avo avo = new Avo();
        Bvo bvo = new Bvo();
        Cvo cvo = new Cvo();

        avo.setId("0001");
        avo.setName("至尊宝");
        avo.setAge("500");

        cvo.setId("101010");
        cvo.setName("秦祥林");
        avo.setCvo(cvo);

        BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo
        System.out.println(bvo);
}

执行结果:

 二:对象内置对象集合和数组:

import java.util.List;
public class Avo {
    private String id;
    private String name;
    private String age;
    private Cvo cvo;
    private List<Cvo> cvoList;//内置对象集合
    private Cvo[] cvos;//内置对象数组

    public String getId() {return id;}
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getAge() {return age; }
    public void setAge(String age) { this.age = age; }
    public Cvo getCvo() {return cvo;}
    public void setCvo(Cvo cvo) { this.cvo = cvo;}

    public List<Cvo> getCvoList() {return cvoList; }
    public void setCvoList(List<Cvo> cvoList) {this.cvoList = cvoList;}

    public Cvo[] getCvos() { return cvos; } 
    public void setCvos(Cvo[] cvos) { this.cvos = cvos; }
}
import java.util.List;
public class Bvo {
    private String id;
    private String name;
    private String age;
    private Cvo cvo;
    private List<Cvo> cvoList;//内置对象集合
    private Cvo[]  cvos;//内置对象数组
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getAge() { return age; }
    public void setAge(String age) { this.age = age; }
    public Cvo getCvo() { return cvo;}
    public void setCvo(Cvo cvo) { this.cvo = cvo; }

    public List<Cvo> getCvoList() {return cvoList;}
    public void setCvoList(List<Cvo> cvoList) { this.cvoList = cvoList;}

    public Cvo[] getCvos() { return cvos; }
    public void setCvos(Cvo[] cvos) { this.cvos = cvos; }

    @Override
    public String toString() {
        return "Bvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", cvo=" + cvo +
                ", cvoList=" + cvoList +
                '}';
    }
}

List集合测试:

public class test {
    public static void main(String[] args) {
    //一行代码完成两个属性相同的对象的值同步,免去所有的get set。
        Avo avo = new Avo();
        Bvo bvo = new Bvo();
        Cvo cvo = new Cvo();
        Cvo cvoTo = new Cvo();
        List<Cvo> cvos = new ArrayList<>();

        avo.setId("0001");
        avo.setName("至尊宝");
        avo.setAge("500");

        cvo.setId("101010");
        cvo.setName("秦祥林");
        cvos.add(cvo);
        cvoTo.setId("202020");
        cvoTo.setName("秦汉");
        cvos.add(cvoTo);
        avo.setCvoList(cvos);

        BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo
        System.out.println(bvo);
}

执行结果:

数组测试:(这里要先重写下Bvo的toString(),我就不贴代码了)

public class test {
    public static void main(String[] args) {
    //一行代码完成两个属性相同的对象的值同步,免去所有的get set。
        Avo avo = new Avo();
        Bvo bvo = new Bvo();
        Cvo cvo = new Cvo();
        Cvo cvoTo = new Cvo();
        List<Cvo> cvos = new ArrayList<>();
        Cvo[] cvoNums = new Cvo[2];

        avo.setId("0001");
        avo.setName("至尊宝");
        avo.setAge("500");

        cvo.setId("101010");
        cvo.setName("秦祥林");
        cvoNums[0]=cvo;
        cvoTo.setId("202020");
        cvoTo.setName("秦汉");
        cvoNums[1]=cvoTo;
        avo.setCvos(cvoNums);

        BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo
        System.out.println(bvo);
}

执行结果:

 

由此可见,spring的BeanUtils帮我们实现了同步两个相同属性的对象的值,它支持了大部分的参数类型,还有其他的类型我就没有一个个的试了,有兴趣的可以自己去试试,我觉得应该都没问题,如果有试到不支持的参数类型的同学请留言一下,谢谢。

注意:

上面所试的都是Avo与Bvo内的对象都为Cvo,假如这里还有一个Dvo对象且与Cvo的属性完全相同,然后Avo里的是Cvo,Bvo里的是Dvo,那就有问题了,如下:

//Dvo与Cvo的属性完全一样
public class Dvo {
    private String id;
    private String name;

    public String getId() {return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public String toString() {
        return "Dvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
public class Avo {
    private String id;
    private String name;
    private String age;
    private Cvo cvo;//Avo对象里的是Cvo
    
    public String getId() {   return id; }
    public void setId(String id) {  this.id = id; }
    public String getName() {  return name; }
    public void setName(String name) {  this.name = name; }
    public String getAge() { return age; }
    public void setAge(String age) { this.age = age;  }
    public Cvo getCvo() {return cvo;}
    public void setCvo(Cvo cvo) { this.cvo = cvo;}
    
}
public class Bvo {
    private String id;
    private String name;
    private String age;
    private Dvo dvo;//Bvo对象里的是Dvo

    public String getId() {  return id; }
    public void setId(String id) {  this.id = id; }
    public String getName() {return name; }
    public void setName(String name) { this.name = name; }
    public String getAge() { return age; }
    public void setAge(String age) { this.age = age;}

    public Dvo getDvo() {return dvo;}
    public void setDvo(Dvo dvo) {this.dvo = dvo;}

    @Override
    public String toString() {
        return "Bvo{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age='" + age + '\'' +
                ", dvo=" + dvo +
                '}';
    }
}

测试:

public class test {
    public static void main(String[] args) {
    //一行代码完成两个属性相同的对象的值同步,免去所有的get set。
        Avo avo = new Avo();
        Bvo bvo = new Bvo();
        Cvo cvo = new Cvo();
        Dvo dvo = new Dvo();

        avo.setId("0001");
        avo.setName("至尊宝");
        avo.setAge("500");

        cvo.setId("101010");
        cvo.setName("秦祥林");
        avo.setCvo(cvo);
        
        BeanUtils.copyProperties(avo, bvo);//将Avo里的值copy给Bvo
        System.out.println(bvo);
}

执行结果:

 

由此可见如果对象内的对象仅是属性相同但对象不同的话是无法同步里面的那个对象的,

我尝试过想先把内对象给同步了,但是报了IllegalArgumentException,

Dvo dvo = bvo.getDvo();
System.out.println(dvo);
BeanUtils.copyProperties(avo.getCvo(),dvo);

无辙,里面的对象就只能get set了 ,痛苦。麻烦有找到这种情况的解决方法的请留言告诉本菜鸟一声,小生感激不尽。

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值