【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 }
二、转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完成后 即可赋值给一个新的对象
如果忍耐算是坚强 我选择抵抗 如果妥协算是努力 我选择争取