最近需要用到比较两个对象属性的变化
其中一个是oldObj
另外一个是newObj
oldObj是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(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 e
) {
//这里报错不需要处理
}
}
}
/**
* 是否可以使用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());
}
}
只需要调用copy方法就行