copy与deepcopy_java clone 深拷贝
大家好,又见面了,我是你们的朋友全栈君。
说到复制方法,在开发程序中要怎么复制呢?其实复制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.cn/186717.html原文链接:https://javaforall.cn
相关文章
- Java刷新bean重新加载bean 上下文 刷新bean
- eclipse怎么导入java文件_Eclipse如何导入JAVA工程?如何将项目导入Eclipse中?
- java开发常用四大框架_大牛经验!常用的5款Java框架汇总[通俗易懂]
- java标识符是什么_Java 标识符「建议收藏」
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java setproperty 未生效_Java System类setProperty()方法及示例[通俗易懂]
- 【说站】java类常量是什么
- Java 零拷贝_java高性能编程
- uint32 java_关于Java的int和C的uint32之间的转换
- java——数组拷贝
- 12款最常用的Java测试工具
- ArrayDeque in Java[通俗易懂]
- java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…
- java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别
- java -POI的基本操作Excel
- Java的学习笔记(09)对象 四
- Java 中的 SimpleDateFormat 【 parse 和 format 】【转换时间格式】
- 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- java 用jdbc连接mysql 并执行sql语句详解数据库
- java解析XML的方法详解编程语言
- 服务Linux启动Java服务:一步步去完成(linux启动java)
- Linux下Java编程之旅(linux执行java)
- 数据库写入Java实现MySQL数据库的写入操作(java向mysql)
- Java程序更新MySQL记录的实践(java更新mysql)
- 服务器上的文件Java获取Linux服务器文件:简单又高效的操作方法(java获取linux)
- 数据管理 管理Redis中的Java过期数据(redisjava过期)
- 处理Redis Java实现高效过期处理(redisjava过期)
- Java轻松处理Redis缓存(java处理redis)
- 期MySQL与Java的长期紧密合作(mysqljava长)
- java中使用DES加密解密实例