一、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 }
二、轉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 }
對象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 }
對象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 }
測試代碼

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 }
測試代碼輸出
三、轉json方式實現數組對象拷貝(能夠達到深拷貝的效果)
3.1、實現原理
step1:將原數組對象轉換為JSONArray格式數據
step2:將JSONArray格式數據再轉回原數組對象格式(需注意:此時數組對象中的元素是JSONObject格式)
step3:將step2中的每一個元素(JSONObject格式)轉換為原指定對象格式
step4:step3完成后 即可賦值給一個新的對象