copy与deepcopy_java clone 深拷贝

copy与deepcopy_java clone 深拷贝说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA深层拷贝DeepCopy的使用方式。方法实现很简单,提供两种方式:一种是序列化成数据流,前提是所有对象(对象中包含的对象…)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以用第二种方式。第二种是将对象序…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

说到复制方法,在开发程序中要怎么复制呢?其实复制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的使用方式,希望本文能帮助到有需要的朋友们。请大家继续关注我们,我们会给大家带来更多的知识。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186717.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • interupt java_Java多线程系列–“基础篇”09之 interrupt()和线程终止方式

    interupt java_Java多线程系列–“基础篇”09之 interrupt()和线程终止方式概要 1 interrupt 说明在介绍终止线程的方式之前 有必要先对 interrupt 进行了解 Interruptsth Unlessthecur whichisalway thecheckAcce

    2025年7月22日
    4
  • datagrip mac激活码【2021.8最新】「建议收藏」

    (datagrip mac激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S32PGH0SQB-eyJsaWNlb…

    2022年3月26日
    348
  • PrCharm激活码【在线破解激活】[通俗易懂]

    PrCharm激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    77
  • 为什么要使用Iocomp控件?

    为什么要使用Iocomp控件?为什么要使用Iocomp控件?作为一个程序员,编写软件的过程中,我们常常需要用一些工控图表和工控仪表,想要自己制作出漂亮极品的控件的非常费时费力的,这时候使用专业的第三方控件就是非常不错的选择。一来节约了开发时间,降低了开发难度;二来第三方控件更加专业更精细;三来降低项目风险。Iocomp控件包括多种用来创建专业的仪表和测量、工业控制、工业监控等相关的应用程序的控件包,如仪表盘控件、开

    2022年7月17日
    13
  • 作业调度和进程调度的辨析题_进程调度的功能有哪些

    作业调度和进程调度的辨析题_进程调度的功能有哪些很多学习完《操作系统原理》这门课程的小伙伴都应该对“FCFS(先到先服务)”、“SJF(短作业优先)”等调度算法原理比较熟悉。但是在实际做题的时候,往往一不小心就把概念搞错,不容易区分“作业调度”和“进程调度”的区别。下面我主要针对这两个概念进行解析并给出经典习题解答。PS:本博客并不详解每种调度算法的原理,因此有这方面需求的小伙伴可以直接pass了。1、作业调度作业调度又称为高级调度,频度较低。其主要工作是将位于外存后备队列中的某个(或某几个)作业调入内存,排在就绪队列上。注意了,这个时候仅仅是将作

    2022年9月29日
    3
  • quotedStr() 应用–DELPHI「建议收藏」

    quotedStr() 应用–DELPHI「建议收藏」varcsql,cstr:string;begin//quotedStr(edit1.text)以说是在sql查询分析器里给字符串edit1.text加个单引号,可以完全抛开delphi的语法.cStr…

    2022年10月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号