【Java】+復制對象 不影響原來的值


 一、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完成后 即可賦值給一個新的對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM