java使用反射比较两个bean对象属性值是否相等

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

public class DomainEquals {

    /**
     * 日志操作类
     */
    private static Logger logger = Logger.getLogger(DomainEquals.class);

    public DomainEquals() {
    }

    /**
     * 比较两个BEAN或MAP对象的值是否相等
     * 如果是BEAN与MAP对象比较时MAP中的key值应与BEAN的属性值名称相同且字段数目要一致
     * @param source
     * @param target
     * @return
     */
    public static boolean domainEquals(Object source, Object target) {
        if (source == null || target == null) {
            return false;
        }
        boolean rv = true;
        if (source instanceof Map) {
            rv = mapOfSrc(source, target, rv);
        } else {
            rv = classOfSrc(source, target, rv);
        }
        logger.info("THE EQUALS RESULT IS " + rv);
        return rv;
    }

    /**
     * 源目标为MAP类型时
     * @param source
     * @param target
     * @param rv
     * @return
     */
    private static boolean mapOfSrc(Object source, Object target, boolean rv) {
        HashMap<String, String> map = new HashMap<String, String>();
        map = (HashMap) source;
        for (String key : map.keySet()) {
            if (target instanceof Map) {
                HashMap<String, String> tarMap = new HashMap<String, String>();
                tarMap = (HashMap) target;
                if(tarMap.get(key)==null){
                    rv = false;
                    break;
                }
                if (!map.get(key).equals(tarMap.get(key))) {
                    rv = false;
                    break;
                }
            } else {
                String tarValue = getClassValue(target, key) == null ? "" : getClassValue(target, key).toString();
                if (!tarValue.equals(map.get(key))) {
                    rv = false;
                    break;
                }
            }
        }
        return rv;
    }

    /**
     * 源目标为非MAP类型时
     * @param source
     * @param target
     * @param rv
     * @return
     */
    private static boolean classOfSrc(Object source, Object target, boolean rv) {
        Class<?> srcClass = source.getClass();
        Field[] fields = srcClass.getDeclaredFields();
        for (Field field : fields) {
            String nameKey = field.getName();
            if (target instanceof Map) {
                HashMap<String, String> tarMap = new HashMap<String, String>();
                tarMap = (HashMap) target;
                String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
                        .toString();
                if(tarMap.get(nameKey)==null){
                    rv = false;
                    break;
                }
                if (!tarMap.get(nameKey).equals(srcValue)) {
                    rv = false;
                    break;
                }
            } else {
                String srcValue = getClassValue(source, nameKey) == null ? "" : getClassValue(source, nameKey)
                        .toString();
                String tarValue = getClassValue(target, nameKey) == null ? "" : getClassValue(target, nameKey)
                        .toString();
                if (!srcValue.equals(tarValue)) {
                    rv = false;
                    break;
                }
            }
        }
        return rv;
    }

    /**
     * 根据字段名称取值
     * @param obj
     * @param fieldName
     * @return
     */
    public static Object getClassValue(Object obj, String fieldName) {
        if (obj == null) {
            return null;
        }
        try {
            Class beanClass = obj.getClass();
            Method[] ms = beanClass.getMethods();
            for (int i = 0; i < ms.length; i++) {
                // 非get方法不取
                if (!ms[i].getName().startsWith("get")) {
                    continue;
                }
                Object objValue = null;
                try {
                    objValue = ms[i].invoke(obj, new Object[] {});
                } catch (Exception e) {
                     logger.info("反射取值出错:" + e.toString());
                    continue;
                }
                if (objValue == null) {
                    continue;
                }
                if (ms[i].getName().toUpperCase().equals(fieldName.toUpperCase())
                        || ms[i].getName().substring(3).toUpperCase().equals(fieldName.toUpperCase())) {
                    return objValue;
                } else if (fieldName.toUpperCase().equals("SID")
                        && (ms[i].getName().toUpperCase().equals("ID") || ms[i].getName().substring(3).toUpperCase()
                                .equals("ID"))) {
                    return objValue;
                }
            }
        } catch (Exception e) {
            // logger.info("取方法出错!" + e.toString());
        }
        return null;
    }

    public static void main(String args[]) {
    }

}
时间: 2024-08-05 00:44:18

java使用反射比较两个bean对象属性值是否相等的相关文章

C#利用反射获取对象属性值

public static string GetObjectPropertyValue<T>(T t, string propertyname){     Type type = typeof(T); PropertyInfo property = type.GetProperty(propertyname); if (property == null) return string.Empty; object o = property.GetValue(t, null); if (o == n

Spring配置中的bean直接引用其它bean的属性值

pring配置中的bean直接引用其它bean的属性值来赋值给当前bean的属性,也可以直接调用其它bean的方法获取返回值来赋值给当前bean的属性,并且可以进行参数传递,这样可以省去在bean中注入需要获取属性值的bean. 以下是一个完整的示例: 1.需要JAVA类: Spring配置中的bean直接引用其它bean的属性值 package com.service.test; public class Bean1 { int v1 = 1; public int getV1() { ret

C#通过属性名字符串获取、设置对象属性值

目录 #通过反射获取对象属性值并设置属性值 #获取对象的所有属性名称及类型 #判断对象是否包含某个属性 #通过反射获取对象属性值并设置属性值 0.定义一个类 public class User { public int Id { get; set; } public string Name { get; set; } public string Age { get; set; } } 1.通过属性名(字符串)获取对象属性值 User u = new User(); u.Name = "lily&

对比两个实体类属性值的差异

/// <summary> /// 对比两个实体类属性值的差异 /// </summary> /// <typeparam name="T">实体类</typeparam> /// <param name="oldMod">原实体类</param> /// <param name="newMod">新实体类</param> /// <return

java正则表达式获取指定HTML标签的指定属性值

package com.mmq.regex; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @use 获取指定HTML标签的指定属性的值 * @FullName com.mmq.regex.MatchHtmlElementAttrValue.java </br> * @JDK 1.6.0 </b

转 利用java反射实现两个具有相同属性bean赋值

package com.dobn.bdgcgl.utils; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ClassReflection { /** * @param class1 用于赋值的实体类 * @param class1 需要待赋值的实体类 * @author ym * @CreateTime 2012-11-22下午03:23:23 * 描述:反射实体类赋值 */ publ

java bean 对象属性复制框架BeanMapping-01-入门案例

项目简介 Bean-Mapping 用于 java 对象属性赋值. 项目中经常需要将一个对象的属性,赋值到另一个对象中. 常见的工具有很多,但都多少不够简洁,要么不够强大. 特性 支持对象属性的浅拷贝 变更日志 变更日志 快速开始 准备 JDK1.8 及其以上版本 Maven 3.X 及其以上版本 maven 项目依赖 <dependency> <groupId>com.github.houbb</groupId> <artifactId>bean-mapp

java利用反射完成不同类之间相同属性的复制

如果我们有两个不同的类对象,但他们具有相同的属性,我们怎么将一个对象的属性值复制给另外一个对象呢? 我们可以利用反射完成这个需求:首先我们利用反射得到两个对象的所有属性,再通过循环得到源对象(被复制的对象)每个属性值,然后再将值复制给目标对象(复制的对象)的属性. 源对象的类: public class UserSource { private String name; private int age; private String address; public String getName(

Java反射获取实体的所有可见属性值,返回Object数组

获取实体的所有可见属性值 以下代码提供了两种实现,一种是基于List,一种是基于Map; 基于List的实现更节省内存,更高效一些:如果你有其它特殊的需求,可以根据实际参考以下代码进行扩展,或许有需要用到Map的情况呢! 当然,使用BeanUtils.describe或PropertyUtils.describe一两句代码就搞定了,但还需要额外添加包引用:另外效率方面是不是更高呢?我没有做过测试. /** * 获取实体的所有可见属性值 * @param object 实体类的实例 * @retu