`
sd8089730
  • 浏览: 258738 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

BeanUtils compare 对象属性值

 
阅读更多
/*
 * Copyright 2002-2007 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.euler.util.beans;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeansException;
import org.springframework.util.Assert;

import com.euler.orm.Organization;

public abstract class BeanUtils {

    /**
     * 对比对象属性值 返回不相同集合
    * @Title: compareProperties
    * @Description: TODO
    * @param @param source
    * @param @param target
    * @param @return
    * @param @throws Throwable   
    * @return List
    * @throws
     */
    public static List compareProperties(Object source,Object target) throws Throwable {
        return compareProperties(source, target,false);
    }

    /**
     * 对比两个对象之间的属性值 返回
     * List<String,Map<String,Map<String,String>>> 
     * try { 
     * list =BeanUtils.compareProperties(organization, organization2);
     *  } catch(Throwable e) { 
     *  // TODO Auto-generated catch block e.printStackTrace(); 
     *  }
     * for (Map map : list) { 
     * Set<String> set=map.keySet();
     *  for(String key:set){
     *   sb.append("字段名"+key); 
     *   Map nmap=(HashMap)map.get(key); 
     *   Set<Object> nset=nmap.keySet(); 
     *   for(Object value:nset){
     *    sb.append("源:"+value);
     * sb.append("目:"+nmap.get(value)); 
     *          } 
     *      } 
     * }
     * 
     * @author Chaiqingsong
     * @Title: compareProperties
     * @Description: TODO
     * @param
     * @param source
     * @param
     * @param target
     * @param
     * @return
     * @param
     * @throws Throwable
     * @return List
     * @throws
     */
    private static List compareProperties(Object source,
                                          Object target,boolean returnString) throws Throwable {

        Assert.notNull(source, "Source must not be null");
        Assert.notNull(target, "Target must not be null");

        Class actualEditable = target.getClass();
        List result = new ArrayList();
        PropertyDescriptor[] targetPds = getPropertyDescriptors(actualEditable);

        for (int i = 0; i < targetPds.length; i++) {
            PropertyDescriptor targetPd = targetPds[i];

            if (targetPd.getWriteMethod() != null) {
                PropertyDescriptor sourcePd = getPropertyDescriptor(source.getClass(), targetPd.getName());
                if (sourcePd != null && sourcePd.getReadMethod() != null) {
                    try {
                        Method readMethod = sourcePd.getReadMethod();
                        if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {
                            readMethod.setAccessible(true);
                        }
                        //源值 和 目标值 对比
                        Object svalue = readMethod.invoke(source, new Object[0]);
                        Object tvalue = readMethod.invoke(target, new Object[0]);
                        if(svalue==null){
                            svalue="";
                        }
                        if (svalue != null && tvalue != null && !svalue.equals(tvalue)) {
                            Map rs = new HashMap();
                            Map values = new HashMap();
                            values.put(svalue, tvalue);
                            rs.put(sourcePd.getName(), values);
                            result.add(rs);
                        }

                    } catch (Throwable ex) {
                        throw ex;
                    }
                }
            }
        }

        return result;
    }

    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        Organization organization = new Organization();
        organization.setOrgid("123456");
        organization.setOrgname("第一个");
        organization.setXtlb("1");

        Organization organization2 = new Organization();
        organization2.setOrgid("654321");
        organization2.setOrgname("第二个");
        organization2.setXtlb("1");
        List<Map> list = null;
        try {
            list = BeanUtils.compareProperties(organization, organization2);
        } catch (Throwable e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (Map map : list) {
            Set<String> set = map.keySet();
            for (String key : set) {
                sb.append("字段名" + key);
                Map nmap = (HashMap) map.get(key);
                Set<Object> nset = nmap.keySet();
                for (Object value : nset) {
                    sb.append("源:" + value);
                    sb.append("目:" + nmap.get(value));
                }
            }
        }
        System.out.println(sb.toString());

    }

}

 

分享到:
评论

相关推荐

    使用BeanUtils操作属性的一个小坑

    例如,我们可以使用`BeanUtils.copyProperties()`方法快速地将一个JavaBean的属性值复制到另一个JavaBean上。但请注意,这种方法默认会忽略源对象中不存在于目标对象的属性,而目标对象中未在源对象中找到的属性将...

    beanutils源码

    4. **空值处理**:BeanUtils在处理属性值时会考虑空值情况,如果源对象的某个属性值为null,不会尝试设置到目标对象,避免了可能的NullPointerException。 5. **国际化支持**:BeanUtils还提供了对国际化(i18n)的...

    beanutils包

    - **通用工具**:BeanUtils作为一个通用的工具包,其很多功能在框架的其他部分也能发挥作用,比如在视图渲染阶段,可以使用BeanUtils获取对象的属性值,以便在模板引擎中展示。 总结来说,Apache Commons BeanUtils...

    BeanUtils jar包+源码

    2. **属性复制**:`copyProperties()`方法是BeanUtils的一个核心功能,它可以将一个JavaBean对象的所有属性值复制到另一个对象中。这个方法可以用来实现对象间的深度拷贝,但需要注意的是,它只拷贝对象可见的并且可...

    BeanUtils类库jar包和源码

    这个类库提供了许多实用方法,能够简化Java开发中的对象属性赋值和获取过程,极大地提高了开发效率。在Java后端开发中,尤其是在与数据库交互时,BeanUtils扮演了重要的角色。 首先,BeanUtils的核心功能在于属性的...

    beanUtils , CopyProperty

    总的来说,Apache BeanUtils库的`copyProperties`方法是Java开发中一个实用的工具,它可以显著提高代码的可读性和简洁性,尤其在处理JavaBean对象属性拷贝时。然而,理解它的内在工作原理和潜在限制同样非常重要,...

    BeanUtils工具类

    BeanUtils库提供了一系列便捷的方法,使得开发者可以更轻松地进行对象属性的设置、获取以及复制,极大地简化了JavaBean的操作流程。下面将详细介绍BeanUtils工具类的核心功能和使用方法。 1. **属性设置与获取** ...

    BeanUtils包

    这个包的出现主要是为了简化对象属性的设置、获取以及复制等操作,从而提高开发效率。BeanUtils库是基于JavaBeans规范的,JavaBeans是一种符合特定规则的Java类,它们通常具有公有的getter和setter方法,用于封装...

    beanUtils包与源码

    这个包的出现极大地简化了对象属性的复制、设置和获取,使得开发者能够更高效地进行Servlet开发。现在,让我们深入探讨BeanUtils包的核心功能、工作原理以及如何结合源码来学习和应用。 首先,BeanUtils的核心功能...

    beanutils 的jar包

    3. **类型转换**:BeanUtils在设置属性值时,会尝试自动进行类型转换。这意味着你可以传递任何类型的值,只要它能被转换为目标属性的类型,BeanUtils就会处理这个转换过程。 4. **异常处理**:BeanUtils在执行过程...

    BeanUtils.rar

    总的来说,BeanUtils是Java开发中一个不可或缺的工具,它通过简化的API帮助开发者更高效地处理对象属性的映射和转换,减少了大量重复的代码,提升了代码的可读性和可维护性。在处理数据绑定、对象复制和转换时,熟练...

    BeanUtilsBean对象复制使用(类型可以自动转化)

    对象复制是指将一个对象的属性值复制到另一个对象的过程,通常用于创建新对象或者初始化对象。`BeanUtilsBean.copyProperties()`方法是实现此功能的关键,它允许我们将一个JavaBean的所有属性值复制到另一个具有相同...

    ourceteams#open-daily#2021_10_21_别再用BeanUtils转换对象啦!这个框架更快更强大!!1

    1. 引包 2. 获取映射工厂 MapperFactor 3. 获取 MapperFacade,进行对象映射

    BeanUtils工具包

    - 如果属性名不完全匹配或者类型转换失败,BeanUtils会抛出异常,因此需要确保对象属性名的正确性和类型的一致性。 - 为了提高性能,可以使用BeanUtils.copyProperties()的重载方法,指定只复制部分属性。 五、...

    commons-beanutils 源码

    - **属性访问**:BeanUtils提供了`getProperty()`和`setProperty()`方法,可以方便地读取和设置JavaBean对象的属性值,无需关注getter和setter方法的具体实现。 - **类型转换**:BeanUtils具备自动类型转换的能力...

    beanUtils jar 包,还包括source和doc

    在Java开发中,BeanUtils是一个非常重要的工具包,尤其在处理对象属性的复制、设置和获取时,它的存在极大地提高了开发效率。BeanUtils是Apache Commons项目的一部分,它提供了一系列方便实用的方法,帮助开发者轻松...

    beanutils 1.8 jar包+源码_阿锦—小白

    首先,BeanUtils库的核心功能在于它提供了方便的Java Bean操作接口,这些接口能够帮助开发者以更简洁的方式处理对象属性的get和set操作。例如,`BeanUtils.copyProperties()`方法可以用来复制一个Bean的所有属性到另...

    commons-beanutils-1.9.4

    - **对象复制**:在业务逻辑中,需要创建与原有对象属性相同的实例时,可以使用BeanUtils的复制功能。 - **属性操作**:当需要动态设置或获取JavaBean的属性时,BeanUtils可以大大减少代码量。 3. **集成与应用**...

    beanutils使用

    在Java开发中,Apache Commons BeanUtils是一个非常实用的工具库,它提供了许多便捷的方法来操作JavaBeans,使得在处理对象属性时变得更加简单。本篇文章将深入探讨如何使用BeanUtils库,特别是通过它将Map对象转换...

    beanutils的jar包

    `BeanUtils`类提供了复制对象属性、创建Bean实例以及属性设置和获取等基本功能,而`PropertyUtils`类则扩展了更高级的属性操作,如集合和数组的处理。 例如,在标题中提到的`commons-beanutils-1.8.0.rar`和`...

Global site tag (gtag.js) - Google Analytics