文档章节

java 复制对象有哪些方式

黄威
 黄威
发布于 07/18 12:24
字数 564
阅读 6
收藏 0

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 array
            FastByteArrayOutputStream 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
     */
    @Test
    public 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>

测试代码:

 @Test
    public 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

© 著作权归作者所有

共有 人打赏支持
黄威
粉丝 11
博文 51
码字总数 29393
作品 0
昌平
程序员
Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法 Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)...

开开心心过
2017/10/17
0
0
《深入理解Java虚拟机》学习小记一之自动内存管理机制(二)

1.概要 在《深入理解Java虚拟机》学习小记一之自动内存管理机制(一)中,我们罗列了以下几个问题: 什么操作可能导致内存溢出? 有哪些种类的内存溢出? 都是在内存的哪些区域溢出? 垃圾收集...

felixlv
2013/05/12
0
1
JVM内存模型及垃圾收集策略解析

AD: JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍过JVM分代垃圾回收策略的基础概念,现在很多编程语言都引入了类似Java JVM的内存模型和垃圾收集器的机制,下面我们将主要针对J...

LEON_SHI
2014/08/19
0
0
【转】Java之 内存区域和GC机制

转自:Leo Chin 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况    Java GC(Garbage Collection,垃圾收集,垃圾回收...

rayner
2016/03/09
0
0
Java Virtual Machine Garbage Collection浅析

在软件开发过程中,Java开发者往往不用关心JVM内存的申请和回收,因为JVM会统一管理对像内存空间的申请和回收。而c/c++开发中,开发者可以自已去管理内存.这中间有管理好的,有管理不好的。比...

ZooKeeper
2013/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
38分钟前
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
49分钟前
0
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
0
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部