`

java对象的克隆以及属性之间的克隆操作

阅读更多
常用的类
apache下beanutils工具类
org.apache.commons.beanutils.BeanUtils

/**
     * 复制对象obj,类似于值传递,非引用
     */
    private Object cloneObject(Object obj) throws Exception {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(obj);
        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        return in.readObject();
    }


/**
     * 比较同一类型class,orig 中非NULL值的属性和dest不同的值到resultBean里面
     * 
     * @param dest 要比较的BEAN
     * @param orig 原来BEAN
     * @param result 结果BEAN
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static void differBeanNotNullPropertyToOtherBean(Object dest, Object orig , Object result) throws IllegalAccessException,
            InvocationTargetException {
        // Validate existence of the specified beans
        if (dest == null) {
            throw new IllegalArgumentException("No destination bean specified");
        }
        if (orig == null) {
            throw new IllegalArgumentException("No origin bean specified");
        }
        if (result == null) {
            throw new IllegalArgumentException("No result bean specified");
        }
        
        if (!dest.getClass().toString().equals(orig.getClass().toString())) {
            throw new IllegalArgumentException("No same bean class");
        }
        if (orig instanceof Map) {
            throw new IllegalArgumentException("No support map");
        }

        /* if (orig is a standard JavaBean) */
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);
        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();
            if ("class".equals(name)) {
                continue; // No point in trying to set an object's class
            }
            if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(dest, name)) {
                try {
                    Object value1 = PropertyUtils.getSimpleProperty(orig, name);
                    Object value2 = PropertyUtils.getSimpleProperty(dest, name);
                    if (value2 != null && !value2.equals(value1)) {
                         if (PropertyUtils.isReadable(result, name) && PropertyUtils.isWriteable(result, name)) {
                             BeanUtils.copyProperty(result, name, value2);
                         }
                    }
                } catch (NoSuchMethodException e) {
                }
            }
        }

    }
    
    /**
     * 比较一个对象,如是这个对象的某一个属性不为空,把他copy到另一个有这个属性的bean中
     * 
     * @param result 要copy到的bean
     * @param orig 原来BEAN
     * @throws InvocationTargetException
     * @throws IllegalAccessException
     */
    public static void copyOrigNotNullPropertyToDestBean(Object result, Object orig) throws IllegalAccessException,
            InvocationTargetException {
        // Validate existence of the specified beans
        if (result == null) {
            throw new IllegalArgumentException("No destination bean specified");
        }
        if (orig == null) {
            throw new IllegalArgumentException("No origin bean specified");
        }
        
        if (orig instanceof Map) {
            throw new IllegalArgumentException("No support map");
        }

        /* if (orig is a standard JavaBean) */
        PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(orig);
        for (int i = 0; i < origDescriptors.length; i++) {
            String name = origDescriptors[i].getName();
            if ("class".equals(name)) {
                continue; // No point in trying to set an object's class
            }
            if (PropertyUtils.isReadable(orig, name) && PropertyUtils.isWriteable(result, name)) {
                try {
                    Object value1 = PropertyUtils.getSimpleProperty(orig, name);
                    if (value1 != null) {
                         if (PropertyUtils.isReadable(result, name) && PropertyUtils.isWriteable(result, name)) {
                             BeanUtils.copyProperty(result, name, value1);
                         }
                    }
                } catch (NoSuchMethodException e) {
                }
            }
        }

    }
分享到:
评论
1 楼 yuxiangtong 2013-05-08  
         

相关推荐

    Java对象的复制克隆

    Java中的对象复制与克隆是程序开发中常见的需求,主要用于创建一个对象的副本,而不会影响原始对象的状态。这里主要讨论两种类型的对象拷贝:浅拷贝和深拷贝。 浅拷贝,也称为表面拷贝,是创建一个新的对象,然后将...

    java 对象克隆

    在Java编程语言中,对象克隆是一种创建一个与原对象具有相同数据的新对象的过程。对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现...

    java 深克隆浅克隆

    克隆技术在处理复杂数据结构、避免对象共享以及实现对象复制等方面有着广泛的应用。Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,...

    JAVA_对象克隆

    本文将深入探讨Java中的对象克隆,包括其原理、实现方式以及注意事项。 一、对象克隆的原理 在Java中,对象克隆可以通过实现`Cloneable`接口并覆盖`Object`类中的`clone()`方法来完成。`Cloneable`接口本身不包含...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    如何进行Java对象的克隆.pdf

    "Java 对象克隆详解" Java 对象克隆是 Java 编程中一个重要的概念。由于 Java 中的对象使用引用类型,所以没有直接的方法可以将对象的内容复制到一个新的对象。Java 提供了一个特殊的 clone() 方法,为所有的引用...

    java 深克隆与浅克隆

    Java 中的克隆机制可以让我们方便地制造出一个对象的副本来,但是在克隆过程中需要注意浅克隆和深克隆的区别。 浅克隆(Shallow Clone)是指对对象的域进行简单的 copy,对象的reference变量也会被copy,但是对应的...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    在MyBatis中,我们通常会定义Mapper接口和XML配置文件,映射SQL语句与Java对象之间的关系。如果需要在数据库操作后复制对象,可以在Mapper接口的方法中,或者在Service层中实现对象复制。 总的来说,Java中的对象...

    Java对象的深克隆与浅克隆详解.zip(wcb2003)

    总的来说,理解Java对象的深克隆和浅克隆是优化代码和解决特定问题的关键。根据具体需求选择合适的克隆方式,可以提高代码的可维护性和灵活性。在设计类和系统时,应考虑对象复制的需求,并决定是否实现`Cloneable`...

    java的深度克隆的例子

    深度克隆,也称为完全克隆,是指创建一个与原对象相同的新对象,不仅复制原对象的所有属性,还复制了原对象中引用的对象。这通常用于创建一个独立于原对象的新实例,即使原对象发生改变,新对象也不会受到影响。下面...

    JAVA浅克隆与深克隆

    在Java编程语言中,克隆是创建一个对象副本的过程,这个副本与原对象有相同的属性值,但作为不同的对象存在。克隆分为两种主要类型:浅克隆(Shallow Clone)和深克隆(Deep Clone)。这篇博客文章将探讨这两种克隆...

    克隆和序列化(Java )

    在Java编程语言中,克隆和序列化是两个...总结来说,Java中的克隆和序列化是两个强大的工具,它们在数据持久化、对象复制以及网络通信等方面有着广泛的应用。理解和熟练掌握这两个概念,对于Java开发者来说至关重要。

    Java中的克隆(Clone)机制

    在Java编程语言中,克隆(Clone)机制是一种创建对象副本的方法,它允许开发者创建一个已有对象的新实例,这个新实例与原对象具有相同的属性值,但却是两个独立的对象,彼此的操作不会互相影响。克隆机制在某些情况...

    java深度克隆

    在Java开发过程中,对象拷贝是一项常见操作。根据拷贝程度的不同,对象拷贝通常分为浅拷贝和深度拷贝两种类型。浅拷贝只复制对象的基本属性,而深度拷贝不仅复制基本属性,还会复制对象所引用的对象,即递归地复制...

    java不同对象之间及集合的复制

    在Java编程中,对象之间的复制是一项常见的操作,特别是在数据传输、模型转换或者持久化存储等场景下。这里的“java不同对象之间及集合的复制”主要关注如何高效且便捷地完成对象及其集合的复制工作,避免繁琐的手动...

    Java编程实现对象克隆(复制)代码详解

    在 Java 编程中,对象克隆是一种非常重要的技术,它允许开发者创建一个对象的副本,具有相同的属性和行为。对象克隆可以分为浅克隆和深克隆,浅克隆仅复制对象的引用,而深克隆则复制对象的所有属性。 对象克隆的...

    clone 深度克隆对象

    深度克隆,也称为完全克隆,是一种创建新对象的技术,这个新对象不仅包含原始对象的所有属性值,还包含了嵌套对象的完整副本。这意味着如果一个对象中包含了其他对象的引用,深度克隆会创建这些引用对象的独立副本,...

    java 对象的克隆(浅克隆和深克隆)

    Java对象的克隆是编程中一个重要的概念,主要用于创建一个对象的新副本,这个副本与原对象具有相同的属性值。在Java中,有两种主要的克隆方式:浅克隆(Shallow Clone)和深克隆(Deep Clone)。接下来,我们将详细...

    深入了解Java对象的克隆

    深入了解Java对象的克隆 Java 对象的克隆是 Java 编程语言中一个重要的概念,它允许开发者创建对象的副本,避免了对象之间的相互影响。在本文中,我们将深入了解 Java 对象的克隆,了解何时需要使用克隆,如何实现...

Global site tag (gtag.js) - Google Analytics