说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA 深层拷贝 DeepCopy的使用方式。

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

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

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

具体代码如下:

public class DeepCopy {

/**

* 深层拷贝

*

* @param

* @param obj

* @return

* @throws Exception

*/

public 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")

public 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 {

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

* @param obj

* @return

* @throws Exception

*/

@SuppressWarnings("unchecked")

public static T copyByJson(T obj) throws Exception {

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

}

}

只需要调用copy方法就行。

以上是爱站技术频道小编分享给大家的详解JAVA 深层拷贝 DeepCopy的使用方式,希望本文能帮助到有需要的朋友们。请大家继续关注我们,我们会给大家带来更多的知识。

java deepcopy_详解JAVA 深层拷贝 DeepCopy的使用方式相关推荐

  1. 【java】详解Java的类文件(class文件)结构

    1.概述 转载:详解Java的类文件(class文件)结构 大家好,我是二哥呀,今天我拿了一把小刀,准备解剖一下 Java 的 class 文件. CS 的世界里流行着这么一句话,"计算机科 ...

  2. java命令详解 java -D

    2019独角兽企业重金招聘Python工程师标准>>> JAVA 命令参数详解: 1.-D<name>=<value> set a system proper ...

  3. java nio详解,Java NIO API详解

    Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...

  4. java jdbc_详解Java基础知识——JDBC

    JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接 ...

  5. Java注释详解-Java文档注释生成Java API文档

    Java文档注释是一种功能强大的注释形式,如果在你所编写的程序中规范的添加文档注释,那你就可以生成一份系统正规的API文档.Java文档注释 /**文档注释内容*/,注意区分多行注释/*多行注释*/. ...

  6. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  7. java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall)

    一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client. 感觉这有点类似于HBase的Sc ...

  8. java intbyreference_详解Java的call by value和call by reference|chu

    题目如下: Java传参的两种方式call by value(值传递):传递的是值(针对基本数据类型),如传递一个整型数值.实际上,按值传递在方法调用方法中,参数只是实际参数的一份拷贝. call b ...

  9. java cache详解,Java内存缓存详解

    1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...

最新文章

  1. ewebeditor下利用ckplayer增加html5 (mp4)全平台的支持
  2. 部门工作中的“求同存异”法则
  3. 2021年MathorCupD题思路
  4. php post收不到值,php 取不到POST 值
  5. 《算法导论》学习总结 — 2.第一章 第二章 第三章
  6. 移动机器人平台-ROS和GitHub链接
  7. L1-005 考试座位号
  8. 软件工程基础-结对项目-WordCount(单词计数)
  9. javascript进制转换_「js基础」JavaScript逻辑和位运算符归纳
  10. SpringBoot项目集成Mybatis Plus(五)条件构造器
  11. keybd_event、SendInput笔记
  12. qt定时器暂停与重新开始_手把手教你写个小程序定时器管理库
  13. 台湾SDN/NFV联盟:集合产业内各部分力量,共同推进NFV技术发展
  14. 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
  15. 怎么查看电脑是不是禁ping_电脑ping怎么打开怎么检测网络连接是否正常 ping网络教程...
  16. 如果批评《说好不哭》不自由,则赞美周杰伦无意义
  17. linux+h3c模拟器下载,h3c模拟器下载
  18. multisim收敛助手有啥用_Multisim 收敛助手报告
  19. 那些花儿(吉他版) --朴树
  20. CITA环境搭建与运行

热门文章

  1. SQL —— decode函数用法
  2. 【游戏开发创新】Unity 2D图片任意形状破碎碎裂效果,以此纪念我的牙光荣牺牲
  3. nginx 编译安装
  4. 十六进制转换成十进制(超简c++)
  5. AngularJS 学习笔记---AngularJS 简介
  6. 2008年10月高等教育国际金融全国统一命题考试
  7. 左边是地狱右边也是地狱_地狱甚至还能做些什么(除了拿走我们的钱)
  8. 并行程序设计实验——高斯消元
  9. 搜索评价指标——NDCG
  10. JAVA基本数据类型及练习题