java 复制对象有哪些方式
2019独角兽企业重金招聘Python工程师标准>>>
java 复制对象有哪些方式
Apache的 Common beanutils库
org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin);
Springframework 的BeanUtil
依赖:
<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency>
BeanUtils.copyProperties(source, target);
Object 流
使用 ObjectInputStream
/*** This method makes a "deep clone" of any Java object it is given.*/public static Object deepClone(Object object) {try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(object);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return ois.readObject();} catch (Exception e) {e.printStackTrace();return null;}}
or
/*** Returns a copy of the object, or null if the object cannot be serialized.<br>* refre:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/*/public static Object copy(Object orig) {Object obj = null;try {// Write the object out to a byte arrayFastByteArrayOutputStream fbos = new FastByteArrayOutputStream();ObjectOutputStream out = new ObjectOutputStream(fbos);out.writeObject(orig);out.flush();out.close();// Retrieve an input stream from the byte array and read// a copy of the object back in.ObjectInputStream in = new ObjectInputStream(fbos.getInputStream());obj = in.readObject();in.close();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException cnfe) {cnfe.printStackTrace();}return obj;}
json序列化
先序列化对象 为json;
然后对该json字符串 反序列化为新的对象.
/**** 2018/7/18*/@Testpublic final void test_CopyObject() {Student student = new Student();student.setName("liuyu");System.out.println("复制前 :" +student.hashCode());String json = HWJacksonUtils.getJsonP(student);Student student2 = (Student)HWJacksonUtils.deSerialize(json, Student.class);System.out.println("student2 :" + student2.getName());System.out.println("复制后 :" +student2.hashCode());}
使用开源库 DozerBeanMapperBuilder
依赖:
<dependency><groupId>com.github.dozermapper</groupId><artifactId>dozer-core</artifactId><version>6.2.0</version></dependency>
测试代码:
@Testpublic final void test_Dozer() {Student student = new Student();student.setName("liuyu2");Mapper instance = DozerBeanMapperBuilder.buildDefault();Student student2 = instance.map(student, Student.class);System.out.println("student2 :" + student2.getName());}
FastByteArrayOutputStream 源码
package com.io.hw.file.util;import java.io.InputStream;
import java.io.OutputStream;/**** refre:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/<br>* ByteArrayOutputStream implementation that doesn't synchronize methods* and doesn't copy the data on toByteArray().** @author huangwei* @since 2015年3月5日*/
public class FastByteArrayOutputStream extends OutputStream {/*** Buffer and size*/protected byte[] buf = null;protected int size = 0;/*** Constructs a stream with buffer capacity size 5K*/public FastByteArrayOutputStream() {this(5 * 1024);}/*** Constructs a stream with the given initial size*/public FastByteArrayOutputStream(int initSize) {this.size = 0;this.buf = new byte[initSize];}/*** Ensures that we have a large enough buffer for the given size.*/private void verifyBufferSize(int sz) {if (sz > buf.length) {byte[] old = buf;buf = new byte[Math.max(sz, 2 * buf.length)];System.arraycopy(old, 0, buf, 0, old.length);old = null;}}public int getSize() {return size;}/*** Returns the byte array containing the written data. Note that this* array will almost always be larger than the amount of data actually* written.*/public byte[] getByteArray() {return buf;}public final void write(byte b[]) {verifyBufferSize(size + b.length);System.arraycopy(b, 0, buf, size, b.length);size += b.length;}public final void write(byte b[], int off, int len) {verifyBufferSize(size + len);System.arraycopy(b, off, buf, size, len);size += len;}public final void write(int b) {verifyBufferSize(size + 1);buf[size] = (byte) b;size++;}public void reset() {size = 0;}/*** Returns a ByteArrayInputStream for reading back the written data*/public InputStream getInputStream() {return new FastByteArrayInputStream(buf, size);}
}
参考:
https://github.com/DozerMapper/dozer
转载于:https://my.oschina.net/huangweiindex/blog/1858700
java 复制对象有哪些方式相关推荐
- java复制对象_JAVA对象复制的方法
1.概述 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与 ...
- java 复制对象_Java核心知识 基础七 JAVA 复制
将一个对象的引用复制给另外一个对象,一共有三种方式.第一种方式是直接赋值,第二种方式 是浅拷贝,第三种是深拷贝.所以大家知道了哈,这三种概念实际上都是为了拷贝对象. 1. 直接赋值复制 直接赋值.在 ...
- java 对象深度复制_Java深度复制– Java复制对象
java 对象深度复制 Today we will look into Java deep copy. Sometimes we want to get a copy of an Object, bu ...
- [转载] Java复制对象与集合工具类
参考链接: Java中的类和对象 项目中经常需要将某个对象的属性值复制给另一个对象,或者将一个集合复制到另一个集合.利用spring提供的BeanUtils,自己简单封装了一个工具类. public ...
- JAVA复制对象给另一个对象
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 今天算是 ...
- Java实现对象的克隆方式
Java实现对象克隆的方法 1.Java实现克隆有两种形式 浅拷贝 深拷贝 在Java中吗,我们说两个对象是否相等通常有两层含义: 对象的内容是否相等,通常使用到对象的 equals(Object o ...
- java 复制对象_Java程序员必备:序列化全方位解析
前言 相信大家日常开发中,经常看到Java对象"implements Serializable".那么,它到底有什么用呢?本文从以下几个角度来解析序列这一块知识点~ 什么是Java ...
- 在 JavaScript 中复制对象
1.JavaScript中的浅拷贝对象 2.深度复制JavaScript中的对象 各种编程语言具有各种数据结构,允许你在内存中组织和存储数据.每个数据结构的工作方式都是独一无二的.例如, ...
- java script 对象
java script 对象 1.创建方式 1)通过字面量的形式创建 例:var = stt{x:1,y:2,y:3}; 或:var = stt{ x:1, y:2, 'for':3 } 注意关键字必 ...
最新文章
- IDC:2018年中国制造业十大预测
- 关于Python3.9,看这张16岁高中生做的「新特性必知图」就够了
- 第二阶段_第五小节_C#基础3
- BZOJ 2707: [SDOI2012]走迷宫( tarjan + 高斯消元 )
- java面试基础_java面试之基础(总结)
- javascript获取css样式文件中定义的样式的方法
- Atitit. 提升开发效率与质量DSL ( 3) ----实现DSL的方式总结
- java webservice 开发总结
- 关于男生追女生的数学模型【转王博】
- 退出CrOS Factory,进入正常Chrome OS
- Java IO和NIO的区别
- 写好一份属于自己的简历
- STM32F103调试出现 while((RCC-CR RCC_CR_PLL2RDY) == 0) 死循环。
- 【系统之家首发】Ghost_Windows7_sp1_Ultimate_x86V2011.10.10 【OEM 通用版】Windows7旗舰版好人一个出品
- 【技术贴】【技术贴】每次双击都会跳出来打开方式的解决办法。。。选择你想用来打开此文件的程序。。...
- b2c o2o_企业对消费者– B2C | 第三部分
- uni-app实现搜索功能
- 1985-2021年全国31省一二三产业就业人数/各省分产业就业人数数据(无缺失)
- 【踩坑】 a value of type “int“ cannot be assigned to an entity of type “TaskHandle_t“
- 软件测试_day02
热门文章
- Codeforces Round #270
- Fragment 和 FragmentActivity的使用
- Linux内核设计第五周学习总结 分析system_call中断处理过程
- redis-3.0.2集群部署
- iOS UITextField清空按钮
- Swift3.0和OC桥接方法
- ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API
- MySQL · myrocks · MyRocks之memtable切换与刷盘
- Linux下修改MAC地址总结
- javascript的词法作用域