java对象深度拷贝

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


import net.sf.json.JSONObject;




public class DeepCopy {
	/**
	 * 深层拷贝
	 * 
	 * @param <T>
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	public static <T> T copy(T obj) throws Exception {
		// 是否实现了序列化接口,即使该类实现了,他拥有的对象未必也有...
		if (Serializable.class.isAssignableFrom(obj.getClass())) {
			// 如果子类没有继承该接口,这一步会报错
			try {
				return copyImplSerializable(obj);
			} catch (Exception e) {
				// 这里不处理,会运行到下面的尝试json
			}
		}
		// 如果序列化失败,尝试json序列化方式
		if (hasJson()) {
			try {
				return copyByJson(obj);
			} catch (Exception e) {
				// 这里不处理,下面返回null
			}
		}
		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) {
				// 这里报错不需要处理
			}
		}
	}


	/**
	 * 是否可以使用json
	 * 
	 * @return
	 */
	private static boolean hasJson() {
		try {
			Class.forName("net.sf.json.JSONObject");
			return true;
		} catch (Exception e) {
			return false;
		}
	}


	/**
	 * 深层拷贝 - 需要net.sf.json.JSONObject
	 * 
	 * @param <T>
	 * @param obj
	 * @return
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static <T> T copyByJson(T obj) throws Exception {
		return (T) JSONObject.toBean(JSONObject.fromObject(obj), obj.getClass());
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值