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的使用方式,希望本文能帮助到有需要的朋友们。请大家继续关注我们,我们会给大家带来更多的知识。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java中array的方法_array java

    java中array的方法_array java题目要求为:卡拉兹(Callatz)猜想:对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的…

  • linux授权文件给指定用户_批量从文件夹移除文件

    linux授权文件给指定用户_批量从文件夹移除文件Linux 如何将一个文件夹的所有内容授权给某一个用户

  • Windows7系统提示当前页面的脚本发生错误怎么办「建议收藏」

    Windows7系统提示当前页面的脚本发生错误怎么办「建议收藏」Windows7系统电脑提示当前页面的脚本发生错误怎么办?下面分享一种方法,希望可以帮到您。工具/原料 电脑 Windows7系统 方法/步骤 打开IE浏览器,点击右上角的“设置”图标,如图所示 打开“Internet选项”,如图所示 在弹出的窗口中,找到“安全”选项,如图所示,点击进入 点击右下角的“将所有区域重置为默认级别”,如图所示 选择“高级”,点击“重置”,如图所示 此时“删除个性化设置

  • route -n命令_router.replace

    route -n命令_router.replace<router-linkclass=”icon-go”:to=”{name:’首页’}”v-if=”$route.matched[0].path==’/category'”></router-link><spanclass=”icon-go”@click=”$router.go(-1)”v-e…

    2022年10月24日
  • Android常用加密库集合

    Android常用加密库集合QS,为了整合常用的各大加解密工具,把各大常用加密方式集合成一个工具库,目前包括:1RSA2AES33DES/DES4HMAC_SHA15国密SM2/SM3/SM46MD57DSA使用简例调用eg1(SM4对称加密):AbstractCodercipher=EncryptionManager.getCipher(EncryptionManager.Model….

  • vue 使用 axios 上传文件 — FormData

    vue 使用 axios 上传文件 — FormData    在此主要介绍如何使用formData对象上传单文件和多文件,FormData就是XMLHttpRequestLevel2新增的一个对象,利用它来提交表单、模拟表单提交,当然最大的优势就是可以上传二进制文件。    过多介绍不说,过多的煽情语句不说,直接来来干活,希望对广大博友有所帮助。也希望各位大神不吝赐教一:前台上传文件的表单和响应函数&lt;!–文件上传…

发表回复

您的电子邮箱地址不会被公开。

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