`

最简单的java 克隆实现

阅读更多
先定义一个标准的javabean对象,并实现持久化接口
请看代码:
package com.ben.clone;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Person implements Serializable
{

	private int age;

	private String name;

	private char sex;

	private List sth = new ArrayList();

	private Map bt = new HashMap();

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public char getSex()
	{
		return sex;
	}

	public void setSex(char sex)
	{
		this.sex = sex;
	}

	public List getSth()
	{
		return sth;
	}

	public void setSth(List sth)
	{
		this.sth = sth;
	}

	public Map getBt()
	{
		return bt;
	}

	public void setBt(Map bt)
	{
		this.bt = bt;
	}
}

再写个类实现二进制克隆对象:
package com.ben.clone;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ByteCloneTest
{
	/**
	 * <pre>
	 * 以二进制方式克隆对象
	 * </pre>
	 * @param src 被克隆的对象
	 * @return 克隆的对象
	 */
	public static final Object byteClone(Object src)
	{
		try
		{
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream out = new ObjectOutputStream(baos);
			out.writeObject(src);
			out.close();
			ByteArrayInputStream bin = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream in = new ObjectInputStream(bin);
			Object clone = in.readObject();
			in.close();
			return (clone);
		}
		catch (ClassNotFoundException e)
		{
			throw new InternalError(e.toString());
		}
		catch (StreamCorruptedException e)
		{
			throw new InternalError(e.toString());
		}
		catch (IOException e)
		{
			throw new InternalError(e.toString());
		}
	}

	public static void main(String[] args)
	{
		Person p = new Person();
		p.setAge(80);
		p.setName("jerry");
		p.setSex('F');
		List list = new ArrayList();
		list.add("apple");
		list.add("orange");
		list.add("banana");
		Map map = new HashMap();
		map.put("哥哥", "liuliu");
		map.put("姐姐", "linlin");
		map.put("李李", "lili");
		p.setBt(map);
		p.setSth(list);
		Person ps = (Person)ByteCloneTest.byteClone(p);
		ps.setName("benlsoft");
		System.out.println("p----"+p.getName());
		System.out.println("ps---"+ps.getName());
	}
}

发现两个克隆的对象包含的对象都不是引用对象。这样就实现了深度克隆,不敢想象。
分享到:
评论
1 楼 tamsiuloong 2010-05-18  
简单是简单 效率相当低

相关推荐

    ion-java, Java流解析器/序列化程序.zip

    ion-java, Java流解析器/序列化程序 一个Java实现的数据符号 。 设置这个库包含一个 git模块 ion-tests,它保存了 ion-java 测试单元使用的测试...克隆 ion-java 存储库并初始化它的ion-tests 模块的最简单方法是运行

    史上最全java面试,103项重点知识,带目录

    62. 如何实现对象克隆? 24 63. 深拷贝和浅拷贝区别是什么? 28 六、Java Web 28 64. jsp 和 servlet 有什么区别? 28 65. jsp 有哪些内置对象?作用分别是什么? 29 66. 说一下 jsp 的 4 种作用域? 29 67. session...

    Java常见面试题208道.docx

    62.如何实现对象克隆? 63.深拷贝和浅拷贝区别是什么? 六、Java Web 64.jsp 和 servlet 有什么区别? 65.jsp 有哪些内置对象?作用分别是什么? 66.说一下 jsp 的 4 种作用域? 67.session 和 cookie 有什么区别? ...

    ion-java:适用于Ion的Java流解析器

    克隆ion-java存储库并初始化其ion-tests子模块的最简单方法是运行以下命令。 $ git clone --recursive https://github.com/amzn/ion-java.git ion-java或者,可以通过运行以下命令与克隆独立地初始化子模块。 $ git...

    openkit-java:OpenKit Java参考实现

    Dynatrace OpenKit-Java参考实现 :information: 我们将默认分支名称更改为main 。 您可以在上找到更新本地克隆的必要步骤。 我们也建议您重命名fork中的默认分支。 什么是OpenKit? OpenKit通过检测那些应用程序的...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第II卷,以开发...

    基于JAVA的搜索引擎 lucene-2.2.0

    简单做个测试吧: package org.shirdrn.lucene; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache....

    BabyGoogle:最简单的谷歌克隆

    宝贝谷歌### 任务:基于 Lucene 全文搜索制作一个简单的“Google”克隆。 要求:一个极其简单的 Web 应用程序,具有以下一组页面: 第 1 页: /index | (GET 方法)包含一个由文本字段和“索引”按钮组成的表单。 ...

    最简单的 SpringBoot + Mybatis + Freemarker 网页增删改查功能

    * 实现最简单的 SpringBoot + Mybatis + Freemarker 网页增删改查功能,适合新接触 Java 和 SpringBoot 的同学参考 * 代码中连接的是云端的测试数据库,长期有效 * 推荐使用 IDEA 开发环境 # 开发环境部署 * 克隆或...

    Javascript中克隆一个数组的实现代码

    这是最简单的方法,但显然不是面试官想要的答案。 最后告知我:利用Array的slice方法。示例如下: 代码如下:var ary = [1,2,3];//源数组 var ary2 = ary.slice(0);//克隆一个新数组 console.log(ary2); /* 改变ary2...

    SourcererCC:Sourcerer的代码克隆项目-Source code

    教程 SourcererCC是基于令牌的代码克隆检测器,用于超大型代码库和Internet规模的项目存储库。 SourcererCC可以在许多粒度级别上工作,例如以任何语言检测文件... 该VM是使用SourcererCC进行自己的克隆分析的最简单方法

    java-practice:'Java 中的练习题

    简单地说,我的目标是学习和理解 Java 的基础知识。 我希望我对 JavaScript 和 Swift 的理解能让我更轻松地过渡到学习 Java。 待办事项清单 完成书中的练习题 指示 克隆存储库: $ git clone git@github....

    初级java笔试题-RMG-Java:RMG的Java版本:React机制生成器

    上入门的最简单方法是从 上下载完整的安装程序包,并阅读也在那里托管的 。 如果你想使用GitHub上托管的尖端开发版本,那么你必须自己编译它。 从源代码编译 视窗 您将需要 、 和 。 您还需要一个 Fortran 编译器,...

    Voronoi-Treemap-Library:Java库,用于计算Voronoi树图

    下面的文章包含与此实现有关的最重要的参考。 Arlind Nocaj,Ulrik Brandes,“计算Voronoi树图:更快,更简单,且与分辨率无关”,计算机图形学论坛,第一卷,第1期。 31号3,2012年6月,第855-864页 请注意,...

    java实现新建文件夹源码-oc-cluster-wrapper:oc群集bash包装器

    java实现新建文件夹OpenShift“oc cluster ...最简单的方法是克隆这个存储库,这样你就可以通过“git pull”命令更新脚本。 但是您始终可以在 . Linux 在 linux 上(在 Fedora 25 上测试过): git clone ...

    JavaCourse:用于JAVA学习目的的项目。 在一个简单的游乐场中包含最常用的代码构造,可用于学习JAVA代码原理

    在一个简单的游乐场中包含最常用的代码构造,可用于学习JAVA代码原理。 类中的每个程序包都包含一些JAVA原则以及可用于学习目的的注释。 安装 安装IDE(推荐:IntelliJ IDEA) 安装Java JDK(从以下下载: : ) ...

Global site tag (gtag.js) - Google Analytics