java

位置:IT落伍者 >> java >> 浏览文章

JAVA 深层拷贝 DeepCopy的使用详解


发布日期:2019年04月02日
 
JAVA 深层拷贝 DeepCopy的使用详解
最近需要用到比较两个对象属性的变化其中一个是oldObj另外一个是newObjoldObj是newObj的前一个状态所以需要在newObj的某个状态时复制一个一样的对象由于JAVA不支持深层拷贝因此专门写了一个方法

方法实现很简单提供两种方式
一种是序列化成数据流前提是所有对象(对象中包含的对象)都需要继承Serializable接口如果都继承了那很容易如果没有继承而且也不打算修改所有类可以用第二种方式

第二种是将对象序列化为json通过json来实现拷贝这种方式需要用到netsfjsonJSONObject
具体代码如下

复制代码 代码如下:
public class DeepCopy {
/**
* 深层拷贝
*
* @param <T>
* @param obj
* @return
* @throws Exception
*/
public static <T> T copy(T obj) throws Exception {
//是否实现了序列化接口即使该类实现了他拥有的对象未必也有
if(SerializableclassisAssignableFrom(objgetClass())){
//如果子类没有继承该接口这一步会报错
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);
ooswriteObject(obj);
bais = new ByteArrayInputStream(baostoByteArray());
ois = new ObjectInputStream(bais);

o = oisreadObject();
return (T) o;
} catch (Exception e) {
throw new Exception("对象中包含没有继承序列化的对象");
} finally{
try {
baosclose();
oosclose();
baisclose();
oisclose();
} catch (Exception e) {
//这里报错不需要处理
}
}
}

/**
* 是否可以使用json
* @return
*/
private static boolean hasJson(){
try {
ClassforName("netsfjsonJSONObject");
return true;
} catch (Exception e) {
return false;
}
}

/**
* 深层拷贝 需要netsfjsonJSONObject
* @param <T>
* @param obj
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static <T> T copyByJson(T obj) throws Exception {
return (T)JSONObjecttoBean(JSONObjectfromObject(obj)objgetClass());
}
}


只需要调用copy方法就行

上一篇:Java程序员应该知道的10个调试技巧

下一篇:使用JSP/Servlet上载文件