1、深度拷贝、复制代码实现

最近需要用到比较两个对象属性的变化,其中一个是oldObj,另外一个是newObj,oldObj是newObj的前一个状态,所以需要在newObj的某个状态时,复制一个一样的对象,由于JAVA不支持深层拷贝,因此专门写了一个方法。

方法实现很简单,提供两种方式:

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

第二种是将对象序列化为json,通过json来实现拷贝,这种方式需要用到net.sf.json.JSONObject。

具体代码如下:

import net.sf.json.JSONObject;

import java.io.*;

class deepCopy {

/**

* 深层拷贝

*

* @param

* @param obj

* @return

* @throws Exception

*/

static 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

* @param obj

* @return

* @throws Exception

*/

@SuppressWarnings("unchecked")

private static 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 {

assert baos != null;

baos.close();

assert oos != null;

oos.close();

assert bais != null;

bais.close();

assert ois != null;

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

* @param obj

* @return

* @throws Exception

*/

@SuppressWarnings("unchecked")

private static T copyByJson(T obj) throws Exception {

return (T) JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass());

}

}

只需要调用copy方法就行。

深度拷贝 java_java 深度拷贝 复制 深度复制相关推荐

  1. 深度拷贝 java_Java深度拷贝方式和性能对比

    前言 Java的深度拷贝大致分为克隆(实现Java的Clone接口)和序列化(实现Java的Serializable接口)两种,但是基于不同的序列化方式,有可以延伸出几种方式.下面分析一下每种的注意事 ...

  2. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  3. python中复制、浅层拷贝、深层拷贝的区别

    python中复制.浅层拷贝.深层拷贝的区别 一.学习要点: 1.python中的复制与拷贝的区别 2.python中浅层拷贝与深层拷贝的区别 二.代码: import copy a=[1,2,3,4 ...

  4. scp(安全拷贝)和rsync(增量复制)

    scp(安全拷贝) 又称为全量复制,每次复制都会复制所有文件. 使用: scp -r 源文件用户名A@主机名1:path1 目标文件用户名B@主机名2:path2 -r: 递归,复制目录 执行过程: ...

  5. C++网易云课堂开发工程师-拷贝构造,拷贝复制,析构函数

    1.带有指针的Class,Class with pointer member 当类内带指针,一定自己写出拷贝构造函数. String s1(); String s2("hello" ...

  6. 【火炉炼AI】深度学习003-构建并训练深度神经网络模型

    [火炉炼AI]深度学习003-构建并训练深度神经网络模型 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotl ...

  7. 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用

    在阅读这篇文章之前,请您先阅读:[深度学习]吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(上)--一步步建立深度神经网络,这篇文章是本篇文章的前篇,没有前篇的基础 ...

  8. 什么是深度学习?我们为何需要深度学习?

    我们在越来越多的领域都能遇到"机器学习"."深度学习"以及 "人工智能"等术语.但它们到底是什么意思?具体可以应用在哪里?我们又为什么需要? ...

  9. deepin更新失败_深度操作系统deepin 20更新:深度下载器和浏览器

    原标题:深度操作系统deepin 20更新:深度下载器和浏览器 深度操作系统20 1003更新发布11031.106(build),新增备份还原.深度下载器.深度浏览器,针对桌面环境.应用软件等进行2 ...

最新文章

  1. 零基础小白如何学习好UI设计
  2. Linux安装Android开发环境
  3. 背包系列 hdu3449 有依赖背包
  4. Linux下用GDB调试程序崩溃错误
  5. 移动端Click300毫秒点击延迟 解决办法
  6. php post调用api,PHP(CURL)POST数据调用API简单示例
  7. array python 交集_Python基础(二)——列表和元组
  8. Flink的累加器(Accumulator)应用
  9. 正则 文字输入不超过5个汉字或者10个字符
  10. python3 输出系统信息
  11. 【渝粤教育】国家开放大学2018年春季 0047-21T计算机办公软件应用 参考试题
  12. 拓端tecdat|Stata估算观测数据的风险比
  13. 智引IT综合管理解决方案
  14. 10 工作中常见知识汇总
  15. el-select 设置为可手动输入
  16. vue做混合式app_基于vue2.0开发混合app的思考
  17. 变频器的工作原理与结构介绍
  18. php pecl 扩展,PECL
  19. 基于TensorRT 5.x的网络推理加速(python)
  20. html如何给盒子设置位置,CSS盒子定位

热门文章

  1. Prim算法的C语言程序
  2. 试除法求最小N个素数之二
  3. POJ3435 Sudoku Checker【谜题+数独】
  4. 方言 —— 各地方言
  5. 非参贝叶斯(Bayesian Non-parameter)初步
  6. 经典数学书目、各数学分支入门清单
  7. matlab 可视化 —— axis
  8. 深入理解 MapReduce
  9. Gamma 分布与 Beta 分布及共轭的含义
  10. 贝叶斯分析——从数值积分到MCMC