p2 =  (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p);
Person p2 = new Person();
p2 = (Person)org.apache.commons.lang3.ObjectUtils.cloneBean(p);
System.out.println(p2);
p2.name = "wewr";
System.out.println(p2);
System.out.println(p); Person{age=1, name='adfa', p=null}
Person{age=1, name='wewr', p=null}
Person{age=1, name='adfa', p=null}

 对象复制的一个使用场景,在使用redis和Hbase处理两个库的事务时,要手动实现事务,在修改一些数据时要先复制一份,在hbase或者dedis做updata操作失败时还原用.

在hbase中没有事务,需要自己实现事务,此时也用到了对象的深复制

第二种方法,通过序列化和反序列话实现,此时被序列化的类需要 implements Serializable

package asdfasdf;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
import org.junit.Test; import java.io.*;
import java.lang.reflect.InvocationTargetException; /**
* Hello world!
*
*/
public class App
{ @Test
public void test1() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { Person p = new Person();
p.age = 1;
p.name = "adfa"; Person p2 = new Person();
p2 = (Person)org.apache.commons.beanutils.BeanUtils.cloneBean(p);
System.out.println(p2);
p2.name = "wewr";
System.out.print(p2);
System.out.print(p); } @Test
public void test2() throws IOException, ClassNotFoundException {
Person p = new Person();
p.age = 1;
p.name = "adfa";
Person p2 = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(p);
// 将流序列化成对象
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
p2 = (Person) ois.readObject();
System.out.println(p2);
p2.name = "wewr";
System.out.println(p2);
System.out.println(p);
}
}
public class Person implements Serializable{
private static final long serialVersionUID = 369285298572941L; //最好是显式声明ID int age;
String name;
Person p;

java对象实现深复制的方法的更多相关文章

  1. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  2. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  3. Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

    OC内部:可变对象和不可变对象的深(复制)拷贝问题思考:   不可变对象:  例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向 ...

  4. JavaScript 对象的深复制

    对象的深复制 源对象的属性更改,不会引起复制后的对象个属性的更改 源对象的任何属性与子属性与新对象的之间没有任何引用关系 Coding: /* 对象的深复制: 1 初始化目标对象 如果没有指定目标对象 ...

  5. java中的深复制和浅复制

    Java 语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单 的赋值来解决对象复制的问题,在开发过程中,也 ...

  6. C# 对象的深复制和浅复制

    2019年第一篇博客,好吧,又大了一岁了,继续加油吧. 正文: C# 中的对象,众所周知是引用类型,那么如何复制对象Object呢,我们来看看下面这段代码: public class User { p ...

  7. js 复制对象的深复制与浅复制

    1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...

  8. 【C#】List<T>对象的深复制

    一.List对象中的T是值类型的情况(int 类型等) 对于值类型的List直接用以下方法就可以复制: List<T> oldList = new List<T>(); old ...

  9. js 对象的深复制 解决不能复制undefined (递归)

    用普通的拷贝  JSON.parse和 JSON.stringify 进行对象拷贝是不会拷贝undefined //普通的拷贝   const obj = {         a: {         ...

随机推荐

  1. python学习:两个py文件间的函数调用

    本例子是测试一些数据分析模型的R值,R值越接近1,表明该模型越适合分析该数据集. 本例子是在集成开发环境Aptana Studio 3 中创建 一个dataAnaly ,然后创建modelTest.p ...

  2. windows下 memcached 和 redis 服务器安装

    memcached 安装: 1.下载memcached 文件: 2.拷贝到运行目录: 3.命令行进入到程序目录: 运行命令: memcached -d install 如果没有报错说明安装成功 4.打 ...

  3. TensorFlow------TFRecords的读取实例

    TensorFlow------TFRecords的读取实例: import os import tensorflow as tf # 定义cifar的数据等命令行参数 FLAGS = tf.app. ...

  4. SQL中inner join,outer join和cross join的区别

    使用join连表,缺陷的情况下是inner join,开发中使用的left join和right join属于outer join,outer join还包括full join 现有两张表,Table ...

  5. 【Linux】debian jessie版本安装1.9 svn

    今天封装使用官方mysql docker镜像时,发现svn版本有问题.需要更新到1.9版本.方法如下. Subversion 1.9 on Debian Jessie November 4, 2015 ...

  6. 使用LNMP常见问题解答

    使用LNMP常见问题解答 一.LNMP的安装过程详解,注:绿色文字为注释,实际使用过程中没有. ##先要下载,并根据不同系统进行安装: wget -c http://soft.vpser.net/ln ...

  7. DevExpress TreeList使用

    using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; us ...

  8. OpenGL(八)使用 subroutine 切换可编程管线

    Subroutine 功能是在OpenGL 4.0 版本号里才添加的.因此对于各种Android手机.这个功能基本跪了.假设你发现你的程序报错:ARB_shader_subroutine.那就说明当前 ...

  9. 算法笔记_088:蓝桥杯练习 8-1因式分解(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 设计算法,用户输入合数,程序输出若个素数的乘积.例如,输入6,输出2*3.输入20,输出2*2*5. 样例 与上面的样例输入对应的输出. ...

  10. 【Linux】Ctentos下载

    百度输入:Download Centos 在百度搜索Download Centos然后进入Centos下载官网 点击上述标记的Download Centos,则会出现如下界面,并且点击"Mo ...