package com.hqyg.disjob.common.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Map; /** * 深度拷贝 * @author Disjob * */ public class DeepCopy { /** * 深层拷贝 ,obj对象务必要实现Serializable接口,否则拷贝失败 * * @param <T> * @param obj * @return * @throws Exception */ public static <T> T copy(T obj) throws Exception { if(obj == null){ return null; } //是否实现了序列化接口,即使该类实现了,他拥有的对象未必也有... if(Serializable.class.isAssignableFrom(obj.getClass())){ //如果子类没有继承该接口,这一步会报错 try { return copyImplSerializable(obj); } catch (Exception e) { //这里不处理,会运行到下面的尝试json e.printStackTrace(); } } return null; } /** * 深层拷贝 - 需要类继承序列化接口 * @param <T> * @param obj * @return * @throws Exception */ @SuppressWarnings("unchecked") public static <T> T copyImplSerializable(T obj) throws Exception { ByteArrayOutputStream baos = null; ObjectOutputStream oos = null; ByteArrayInputStream bais = null; ObjectInputStream ois = null; Object o = null; //如果子类没有继承该接口,这一步会报错 try { baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(obj); bais = new ByteArrayInputStream(baos.toByteArray()); ois = new ObjectInputStream(bais); o = ois.readObject(); return (T) o; } catch (Exception e) { throw new Exception("对象中包含没有继承序列化的对象"); } finally{ try { baos.close(); oos.close(); bais.close(); ois.close(); } catch (Exception e2) { //这里报错不需要处理 } } } public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("1", "123"); Map<String, String> map1=new HashMap<String, String>(); try { map1 = DeepCopy.copy(map); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } map.remove("1"); map.put("123", "12344"); for (Map.Entry<String, String> entry:map.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } System.out.println("=================="); for (Map.Entry<String, String> entry:map1.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } } }