原理:把对象序列化成流,再从流反序列化成对象,这样就是新的对象了。
事前准备:
@Data public class ItWorker { private String name; private String sex; private LiveAddress address; }
@Data public class LiveAddress { private String province; private String city; private String area; }
方式一:通过json工具序列化,把对象序列化成json字符串,然后再从字符串反序列化成对象,从而实现深拷贝。
public static void main(String[] args) { ItWorker itWorker = new ItWorker(); itWorker.setName("法外狂徒张三"); itWorker.setSex("男"); LiveAddress liveAddress = new LiveAddress(); liveAddress.setProvince("江苏"); liveAddress.setCity("苏州"); liveAddress.setArea("独墅湖"); itWorker.setAddress(liveAddress); ItWorker deepItWorker = JSON.parseObject(JSON.toJSONString(itWorker), ItWorker.class); deepItWorker.getAddress().setCity("南京"); System.out.println(itWorker); System.out.println(deepItWorker); }
输出:
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=苏州, area=独墅湖))
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=南京, area=独墅湖))
方式二:使用Apache Commons Lang中提供的SerializationUtils工具实现深拷贝。
前提:实现Serializable
public class ItWorker implements Serializable
public class LiveAddress implements Serializable
public static void main(String[] args) { ItWorker itWorker = new ItWorker(); itWorker.setName("法外狂徒张三"); itWorker.setSex("男"); LiveAddress liveAddress = new LiveAddress(); liveAddress.setProvince("江苏"); liveAddress.setCity("苏州"); liveAddress.setArea("独墅湖"); itWorker.setAddress(liveAddress); ItWorker deepClone = (ItWorker) SerializationUtils.clone(itWorker); deepClone.getAddress().setCity("峨眉山"); System.out.println(itWorker); System.out.println(deepClone); }
输出:
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=苏州, area=独墅湖))
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=峨眉山, area=独墅湖))