java中定义一个CloneUtil 工具类
其实所有的java对象都可以具备克隆能力,只是因为在基础类Object中被设定成了一个保留方法(protected),要想真正拥有克隆的能力,
就需要实现Cloneable接口,重写clone方法。通过克隆方法得到的对象是一个本地的副本。
1、实现Cloneable接口
具体看代码:
class User implements Cloneable{
int age;
public User(int age){
//用this关键字不至于类成员变量与形参混淆
this.age=age;
}
//这里可加@Override也可不加,加了会自动提示是否正确
@Override
public Object clone{
Object o=null;
try{
o=super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
}
public String toString(){
return Integer.toString(this.age);
}
}
2、自己手动写一个CloneUtil 工具类,不是实现Cloneable这种方式,但是能达到效果。
package cn.com.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 对象clone 工具类
* @author
*
*/
public class CloneUtil {
public static Object clone(Serializable obj) {
Object clone = cloneObject(obj);
if (clone == null) {
clone = cloneObject(obj);
}
return clone;
}
public static Object cloneObject(Serializable obj) {
Object anotherObj = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais);
anotherObj = ois.readObject();
} catch (IOException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} catch (ClassNotFoundException ex) {
throw new RuntimeException(ex.getMessage(), ex);
} catch (StackOverflowError error) {
System.out.println("stack length " + error.getStackTrace().length);
error.printStackTrace();
return null;
} finally {
if (oos != null)
try {
oos.close();
} catch (IOException localIOException3) {
}
if (ois != null)
try {
ois.close();
} catch (IOException localIOException4) {
}
}
return anotherObj;
}
public static int getObjectSize(Serializable obj) {
ByteArrayOutputStream bs = new ByteArrayOutputStream();
try {
ObjectOutputStream os = new ObjectOutputStream(bs);
os.writeObject(obj);
os.flush();
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
return bs.size();
}
}
java中定义一个CloneUtil 工具类相关推荐
- 39.在Java中定义一个不做事且没有参数的构造方法的作用?
1 在Java中定义一个不做事且没有参数的构造方法的作用 Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会 调用父类中"没有参数的构造方法&quo ...
- java 整型数组定义_在Java中定义一个具有10个元素的整型数组a的语句是:___
在Java中定义一个具有10个元素的整型数组a的语句是:___ 答: int [] arr = new int[10] 在借贷记账法下() 答:在账户结构上,"借"和"贷 ...
- java中常用的日期工具类
java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util;import java.text.ParseException; import jav ...
- Java中操作字符串的工具类-判空、截取、格式化、转换驼峰、转集合和list、是否包含
场景 某些常用的对字符串进行处理的方法抽离出来成工具类,方便在多处应用. 常用的操作为: 判断是否为空 截取字符串 格式化文本 字符串转set 字符串转list 下划线转驼峰命名 是否包含字符串 注: ...
- java 抽象属性_怎样在java中定义一个抽象属性
[51CTO活动]8.26 带你深度了解清华大学.搜狗基于算法的IT运维实践与探索 Abstract关键字通常被用于类和方法,用来把某些行为的实现委托给子类.由于Java不支持抽象属性,如果你试图将类 ...
- java中定义一个时间_Java中的日期和时间
根据个人目前正在编写的<Java核心编程-基础篇>的规划,这部分属于第15章内容,这里沿用了书中的章节编号.另外,因为原文篇幅太长,这里适当做了删减. 15.1.概述 在 Java 8 之 ...
- java des 加密工具的使用,Java中DES加密解密工具类的实现实例
这篇文章主要介绍了Java实现的DES加密解密工具类,结合具体实例形式分析了Java实现的DES加密解密工具类定义与使用方法,需要的朋友可以参考下 本文实例讲述了Java实现的DES加密解密工具类.分 ...
- java中常用到的工具类使用
Tool 不定期更新,建议收藏,收录日常所用 1,判断对象是否为空的常用工具类 2,对象和数组的复制 3,关于拼接字符串去掉最后一个符号的三种方式 4,判断对象值属性不为null并且不为空字符串 5, ...
- JWT|概述|JWT结构|JWT在java中的使用|JWT工具类的封装|JWT在springboot中的使用|JWT与拦截器的配合
JWT ! 前记: 官网:https://jwt.io/ jwt有人说是用计算力换空间(相对于session) 小程序后台要求全部用springboot实现..登录状态的管理:本来想用自己随便生成UU ...
最新文章
- 架构实战项目心得(三):JAVA和MAVEN的环境配置
- hadoop3.2.0集群搭建的一些坑!
- aws创建html网页,AWS: 在AWS上创建一个网站,综合运用(Lambda + Api Gateway + Dynamodb + S3)...
- cocos2d-x游戏开发(八)各类构造器
- 允许使用抽象类类型 isearchboxinfo 的对象_Java学习5-设计模式+抽象类/方法
- python123io如何编辑_计算机二级python学习教程(1) 教大家如何学习python
- 重叠面积_20天津中考试卷及答案(24题重叠面积画板制作教程)
- LCA SP913 QTREE2 - Query on a tree II
- Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
- Neutron Vlan Network 原理- 每天5分钟玩转 OpenStack(92)
- linux内核之dmaengine
- python与数据挖掘课后实验答案_数据仓库与数据挖掘课后习题答案
- 餐饮业实施5S管理的效益及实施方案
- 如何把控单元测试的粒度让你省时省力甚至一劳永逸建议一键收藏
- CAD关于文字样式删除文字样式操作(com接口c#语言)
- 批量转化文件夹下图片格式方法,简单易操作!
- 论文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的学习笔记
- ts获取服务器数据_ts 流服务器
- 消费者需求研究能够解决什么问题
- C++重温笔记(十二): C++多文件编程
热门文章
- leetcode116. 填充每个节点的下一个右侧节点指针
- C++:32---IO库
- Nginx 配置UDP负载均衡
- Python(10)- 格式化输出%
- 推荐算法--利用用户行为数据(02)
- 在wsl下运行c语言,在Windows10通过WSL架设linux/gcc c语言学习环境
- 使用百度大脑,导入aip以及相应的库文件报错问题
- Android Studio 安装ASM插件
- 要有自己的核心竞争力,应对时代变迁
- x264里的2pass指的是什么意思? x264源代码分析2.encode()