首页 > 技术文章 > 【Java】+复制对象 不影响原来的值

danhuai 2019-11-18 17:00 原文

 一、BeanUtils.copyProperties(仅能实现浅拷贝 深拷贝不行)

 1     @Test
 2     public void testeee() {
 3         List<DeliveryContentVO> contentVOList = new ArrayList<>();
 4         DeliveryContentVO contentVO1 = new DeliveryContentVO();
 5         contentVO1.setId("1");
 6         contentVO1.setIndex(1);
 7         contentVOList.add(contentVO1);
 8 
 9         DeliveryContentVO contentVO2 = new DeliveryContentVO();
10         try {
11             BeanUtils.copyProperties(contentVO2,contentVO1);
12         } catch (Exception e) {
13             e.printStackTrace();
14         }
15         contentVO2.setId("2");
16         contentVO2.setIndex(2);
17         contentVOList.add(contentVO2);
18 
19         System.out.println(JSONObject.toJSON(contentVOList));
20     }
View Code

 

二、转json方式实现对象拷贝(能够达到深拷贝的效果)

2.1、实现原理:

超简单 一行代码轻松搞定

step1:将原对象转换为JSONObject格式数据

step2:将JSONObject格式数据再转回原对象格式 

step3:将step2转换后的数据赋值给一个新的对象

2.2、代码示例:

对象1

 1 package copy;
 2 
 3 public class ObjectA {
 4     private String a1;
 5     private int a2;
 6 
 7     public String getA1() {
 8         return a1;
 9     }
10 
11     public void setA1(String a1) {
12         this.a1 = a1;
13     }
14 
15     public int getA2() {
16         return a2;
17     }
18 
19     public void setA2(int a2) {
20         this.a2 = a2;
21     }
22 
23 }
View Code

对象2

 1 package copy;
 2 
 3 public class ObjectB {
 4     String b1;
 5     int b2;
 6 
 7     public String getB1() {
 8         return b1;
 9     }
10 
11     public void setB1(String b1) {
12         this.b1 = b1;
13     }
14 
15     public int getB2() {
16         return b2;
17     }
18 
19     public void setB2(int b2) {
20         this.b2 = b2;
21     }
22 
23 }
View Code

对象3

 1 package copy;
 2 
 3 public class MyObject {
 4     private String myObject;
 5     private ObjectA myObjectA;
 6     private ObjectB myObjectB;
 7 
 8     public String getMyObject() {
 9         return myObject;
10     }
11 
12     public void setMyObject(String myObject) {
13         this.myObject = myObject;
14     }
15 
16     public ObjectA getMyObjectA() {
17         return myObjectA;
18     }
19 
20     public void setMyObjectA(ObjectA myObjectA) {
21         this.myObjectA = myObjectA;
22     }
23 
24     public ObjectB getMyObjectB() {
25         return myObjectB;
26     }
27 
28     public void setMyObjectB(ObjectB myObjectB) {
29         this.myObjectB = myObjectB;
30     }
31 }
View Code

测试代码

 1 package copy;
 2 
 3 import com.alibaba.fastjson.JSONObject;
 4 
 5 public class TestCopy {
 6     public static void main(String[] args) {
 7         /** step1 原数据初始化 */
 8         MyObject myObject = new MyObject();
 9         myObject.setMyObject("原对象my");
10 
11         ObjectA objectA = new ObjectA();
12         objectA.setA1("原对象objectA1");
13         objectA.setA2(666);
14 
15         ObjectB objectB = new ObjectB();
16         objectB.setB1("原对象objectB1");
17         objectB.setB2(999);
18 
19         myObject.setMyObjectA(objectA);
20         myObject.setMyObjectB(objectB);
21 
22         /** step2 拷贝(原理为:将原对象转换为json格式 然后再转回原对象的格式 最后赋值给新对象) */
23         // 方式1(清楚写法)
24         //MyObject myObjectNew;
25         //JSONObject jsonObject = (JSONObject) JSONObject.toJSON(myObject);
26         //myObjectNew = JSONObject.toJavaObject(jsonObject, MyObject.class);
27 
28         // 方式2(简化写法)
29         MyObject myObjectNew = JSONObject.toJavaObject((JSONObject) JSONObject.toJSON(myObject), MyObject.class);
30 
31         /** step3 改变新对象的值 */
32         myObjectNew.setMyObject("xin");
33         myObjectNew.getMyObjectA().setA1("xin");
34 
35         /** step4 校验 改变新对象的数据 看原对象的数据是否会变(不会) */
36         System.out.println(String.format("原数据:%s", JSONObject.toJSON(myObject)));
37         System.out.println(String.format("新数据:%s", JSONObject.toJSON(myObjectNew)));
38     }
39 }
View Code

 测试代码输出

 

 

三、转json方式实现数组对象拷贝(能够达到深拷贝的效果)

3.1、实现原理

step1:将原数组对象转换为JSONArray格式数据

step2:将JSONArray格式数据再转回原数组对象格式(需注意:此时数组对象中的元素是JSONObject格式) 

step3:将step2中的每一个元素(JSONObject格式)转换为原指定对象格式

step4:step3完成后 即可赋值给一个新的对象

推荐阅读