java deepcopy_详解JAVA 深层拷贝 DeepCopy的使用方式
说到复制方法,在开发程序中要怎么复制呢?其实复制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的使用方式相关推荐
- 【java】详解Java的类文件(class文件)结构
1.概述 转载:详解Java的类文件(class文件)结构 大家好,我是二哥呀,今天我拿了一把小刀,准备解剖一下 Java 的 class 文件. CS 的世界里流行着这么一句话,"计算机科 ...
- java命令详解 java -D
2019独角兽企业重金招聘Python工程师标准>>> JAVA 命令参数详解: 1.-D<name>=<value> set a system proper ...
- java nio详解,Java NIO API详解
Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...
- java jdbc_详解Java基础知识——JDBC
JDBC Java DataBase Connectivity,java数据库连接,为了降低操作数据的难度,java提供jdbc,按照java面向对象特点,对操作进行了很多封装. JDBC提供了很多接 ...
- Java注释详解-Java文档注释生成Java API文档
Java文档注释是一种功能强大的注释形式,如果在你所编写的程序中规范的添加文档注释,那你就可以生成一份系统正规的API文档.Java文档注释 /**文档注释内容*/,注意区分多行注释/*多行注释*/. ...
- 【java】详解java中的注解(Annotation)
目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...
- java hgetall_详解Java使用Pipeline对Redis批量读写(hmsethgetall)
一般情况下,Redis Client端发出一个请求后,通常会阻塞并等待Redis服务端处理,Redis服务端处理完后请求命令后会将结果通过响应报文返回给Client. 感觉这有点类似于HBase的Sc ...
- java intbyreference_详解Java的call by value和call by reference|chu
题目如下: Java传参的两种方式call by value(值传递):传递的是值(针对基本数据类型),如传递一个整型数值.实际上,按值传递在方法调用方法中,参数只是实际参数的一份拷贝. call b ...
- java cache详解,Java内存缓存详解
1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...
最新文章
- ewebeditor下利用ckplayer增加html5 (mp4)全平台的支持
- 部门工作中的“求同存异”法则
- 2021年MathorCupD题思路
- php post收不到值,php 取不到POST 值
- 《算法导论》学习总结 — 2.第一章 第二章 第三章
- 移动机器人平台-ROS和GitHub链接
- L1-005 考试座位号
- 软件工程基础-结对项目-WordCount(单词计数)
- javascript进制转换_「js基础」JavaScript逻辑和位运算符归纳
- SpringBoot项目集成Mybatis Plus(五)条件构造器
- keybd_event、SendInput笔记
- qt定时器暂停与重新开始_手把手教你写个小程序定时器管理库
- 台湾SDN/NFV联盟:集合产业内各部分力量,共同推进NFV技术发展
- 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
- 怎么查看电脑是不是禁ping_电脑ping怎么打开怎么检测网络连接是否正常 ping网络教程...
- 如果批评《说好不哭》不自由,则赞美周杰伦无意义
- linux+h3c模拟器下载,h3c模拟器下载
- multisim收敛助手有啥用_Multisim 收敛助手报告
- 那些花儿(吉他版) --朴树
- CITA环境搭建与运行