`

最简单的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  
简单是简单 效率相当低

相关推荐

    java深度克隆

    通过上述介绍可以看出,Java中的深度克隆可以通过多种方式实现,开发者可以根据实际情况选择最适合的方法。无论是使用`Cloneable`接口还是序列化与反序列化,深度克隆都能有效地解决对象拷贝带来的问题,提高程序的...

    深入JAVA对象深度克隆的详解

    要实现深度克隆,首先,你的类需要实现`java.io.Serializable`接口,这是Java中用于序列化的标记接口。然后,你可以定义一个名为`copy()`的方法来执行深度克隆,如下所示: ```java public class YourClass ...

    java API 在包java.util中有一个GregorianCalendar类,使用它可以得到一年内某个月的日历.zip

    这个类是基于格里高利历(公历)的,是Java中最常用的日期时间类之一。在给定的压缩包文件中,可能包含了关于如何使用`GregorianCalendar`来获取一年内特定月份的日历信息的练习代码,如`Exercise6_6.java`,以及...

    Java入门到精通完整教程+源码.zip

    通常,这种命名方式表示这是一个Git仓库的克隆或导出,其中包含了一系列的课程材料和示例代码。这意味着你将获得一个结构化的学习路径,而不是零散的教程。 在Java学习的初期,你将接触到基础语法和概念,如变量、...

    更新至2020年12月最全Java 面试全解析:核心知识点与典型面试题.pdf

    在准备Java面试的过程中,面试者应注重知识点的理解和应用,而不是简单地死记硬背。通过实际的编码实践和问题解决能力,能够更好地应对面试官的提问,同时加深对Java编程的理解。另外,多线程编程是Java面试中的一个...

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

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

    关于jquery克隆,给元素赋值详解

    本文将深入探讨如何使用jQuery实现元素的克隆以及如何为元素赋值,同时也会提及如何结合使用AJAX技术进行克隆操作。 首先,让我们了解什么是元素克隆。在编程中,克隆指的是创建一个对象或结构的副本,这个副本与...

    Java面对对象实验(项目文件)2013521

    7. **五子棋**:可能是一个简单的Java游戏示例,用于实践事件处理和图形用户界面(GUI)编程,这通常是Java桌面程序的一部分。 8. **Java_Date**:Java的日期和时间处理涉及java.util.Date和java.time包中的类。...

    java.lang包介绍

    `java.lang`包中最基本的类是`Object`,它是所有类层次结构的根,而`Class`类的实例则代表运行时的类。 `java.lang`包包括以下关键类: 1. **Boolean**: 表示布尔值`true`和`false`。 2. **Long, Short, Byte, ...

    java-lang包详解

    - **String**: 用于表示不可变的字符序列,是Java中最常用的数据类型之一。 - **Character**: 处理单个Unicode字符,包括字符的转换和比较。 - **Number**: 是所有数值类型的抽象基类,如Integer、Double等。 - ...

    JAVA常见面试题300道

    如果不实现这两个接口,Java 无法保证对象的状态可以正确复制或恢复,因此不能进行克隆或序列化操作。 #### 20. Iterator 接口的功能是什么? Iterator 接口提供了遍历集合元素的标准方法。它允许用户迭代地访问...

    从零开始学java web

    Spring是Java Web开发中最受欢迎的框架之一,提供依赖注入、AOP(面向切面编程)等功能。本章将介绍Spring的基本概念和配置。 第十章:Spring MVC与RESTful API Spring MVC是Spring框架的一部分,用于构建Web应用。...

    JAVA经典教材笔记

    #### 第二章:简单Java程序 - 通过编写简单的Java程序来熟悉开发流程和基本语法结构。 #### 第三章:Java基础程序设计 - **Java数据类型** - 基本数据类型:如int、double等。 - 引用数据类型:如String、数组...

    java代码静态检测规则

    1. **接口声明**:实现`Cloneable`接口可以让其他代码知道这个类可以被安全地克隆。 2. **设计模式**:这是克隆设计模式的一部分,用于保证对象的深复制。 ### default 在 switch 的最后 (checkstyle:...

    30 个 Java 集合面试问题及答案.docx

    例如,某些Collection实现可能支持克隆和序列化,而其他实现可能不支持或者有不同的实现方式。因此,将这些行为强制绑定在接口上会限制实现的灵活性。 Map接口并不继承Collection接口,因为Map是一种键值对的数据...

Global site tag (gtag.js) - Google Analytics