`
bruceyu
  • 浏览: 31123 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

比较两个Bean是否相等

阅读更多

最近项目中,反复需要用到比较两个Bean是否全等的情况,许多人都是一个元素一个元素的比下去,效率太低了。于是写了一个用于比较两个同构Bean的函数与大家分享,若有什么更好的办法也请不吝赐教。

 

/**
 * 比较两个Bean中所有元素是否全等,是返回True,有一个不等则返回False<br/>
 * 参数的位置和结果无关
 * @param obj1 第一个Bean
 * @param obj2 第二个Bean
 * @return 是否全等的boolean值
 */
private boolean compareBeans(Object obj1, Object obj2) {

	if((null == obj1 && null != obj2) || (null != obj1 && null == obj2)) {
		return false;
	} else if(null == obj1 && null == obj2){
		return true;
	}
	Field[] fieldArr1 = obj1.getClass().getDeclaredFields();
	Field[] fieldArr2 = obj2.getClass().getDeclaredFields();
	if(fieldArr1.length != fieldArr2.length) {
		return false;
	} else {
		Field field1, field2;
		String typeName1, typeName2;
		Object tmpObj1, tmpObj2;
		for(int i = 0; i < fieldArr1.length; i++) {
			field1 = fieldArr1[i];
			field2 = fieldArr2[i];
			field1.setAccessible(true);
			field2.setAccessible(true);
			typeName1 = field1.getType().getName();
			typeName2 = field2.getType().getName();
			if(!StringUtils.equals(typeName1, typeName2)) {
				return false;
			}
			tmpObj1 = field1.get(obj1);
			tmpObj2 = field2.get(obj2);
			if((null == tmpObj1 && null != tmpObj2) || (null != tmpObj1 && null == tmpObj2)) {
				return false;
			} else if(null == tmpObj1 && null == tmpObj2){
				continue;
			}
			if(boolean.class.equals(typeName1)) {
				if(!((Boolean)tmpObj1).equals((Boolean)tmpObj2)) {
					return false;
				}
			} else if(double.class.equals(typeName1)) {
				if(!((Double)tmpObj1).equals((Double)tmpObj2)) {
					return false;
				}
			} else if(float.class.equals(typeName1)) {
				if(!((Float)tmpObj1).equals((Float)tmpObj2)) {
					return false;
				}
			} else if(int.class.equals(typeName1)) {
				if(!((Integer)tmpObj1).equals((Integer)tmpObj2)) {
					return false;
				}
			} else if(long.class.equals(typeName1)) {
				if(!((Long)tmpObj1).equals((Long)tmpObj2)) {
					return false;
				}
			} else if(char.class.equals(typeName1)) {
				if(!((Character)tmpObj1).equals((Character)tmpObj2)) {
					return false;
				}
			} else if(String.class.equals(typeName1)) {
				if(!((String)tmpObj1).equals((String)tmpObj2)) {
					return false;
				}
			} else {
				if(!(tmpObj1.toString().equals(tmpObj2.toString()))) {
					return false;
				}
			}
		}
	}
	return true;
}

 

分享到:
评论
1 楼 sghys 2011-02-12  
正好有用,thx

相关推荐

    Spring Bean重复执行两次(实例被构造两次)问题分析

    如果一个BeanA依赖于另一个BeanB,同时BeanB也依赖于BeanA,那么Spring在处理依赖关系时可能会陷入循环引用,导致两个Bean都实例化两次。 3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行...

    Java EJB中有、无状态SessionBean的两个例子.rar

    在给定的"Java EJB中有、无状态SessionBean的两个例子"压缩包中,可能包含了以下内容: - 有状态SessionBean示例:可能包含一个实现SSB的Java类,以及对应的接口。这个类会覆盖一些方法来处理客户端的请求,并在...

    利用java反射达到两个不同bean字段名相同,类型不相同的字段相互赋值的转换函数

    利用java反射达到两个不同bean字段名相同,类型不相同的字段相互赋值的转换函数

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    4. **@Qualifier注解**:如果还有多个bean,且没有`@Primary`,Spring会检查`@Autowired`注解是否带有`@Qualifier`,并根据指定的bean名称进一步筛选。 5. **索引**:如果以上方式都无法确定唯一bean,那么可以为...

    Java EJB中有、无状态SessionBean的两个例子.7z

    压缩包中的例子可能包含了两个项目,分别演示了无状态和有状态Session Bean的实现。无状态的例子可能展示了一个简单的计算器服务,每次调用方法时只基于当前参数执行计算,而不关心之前的操作。有状态的例子可能是一...

    深度转换Bean<->Bean的Mapper

    首先,BeanMapper的核心功能是将一个对象的属性值复制到另一个对象,即使这两个对象的结构不同。这种转换对于数据模型间的映射非常有用,例如在业务逻辑层和数据访问层之间,或者在API响应与内部模型之间。 在描述...

    Spring定义bean的三种方式和自动注入

    此外,通过`property`标签注入依赖,如`teacher`字段,使用`ref`属性引用另一个Bean。这种方式需要Bean有对应的setter方法,以便Spring进行依赖注入。 ```xml &lt;bean id="student" class="test.Student"&gt; 张三"/&gt;...

    使用java类配置Bean

    在这个例子中,`AppConfig`类被标记为配置类,`myService()`和`myRepository()`方法分别声明了两个Bean。每个`@Bean`方法都会被Spring调用一次,以创建对应的Bean实例。 **依赖注入**:在Java配置中,依赖注入可以...

    JavaEE 使用注解配置Bean的一个示例

    7. **@PostConstruct** 和 **@PreDestroy**:这两个注解标记的方法会在Bean初始化后和销毁前执行,用于执行特定的初始化或清理操作。 8. **@Configuration** 和 **@Bean**:这两个注解通常一起使用,用以替代XML...

    beandiff:BeanDiff是一个简单的库,可以使用反射来比较两个对象

    BeanDiff是一个简单的库,用于使用反射比较两个对象。 这些对象不必具有相同的类型。 BeanDiff查找匹配的字段名称并比较值。 ##用法 A a = new A (); a . setName( " Hello " ); B b = new B (); b . set...

    java合并LIST

    在本示例中,我们使用了一个嵌套循环来遍历LIST,并检查每个元素是否存在重复,如果存在,则合并这两个元素。 下面是相关知识点的总结: 1. Java中的LIST合并:Java提供了多种方式来合并LIST,包括使用addAll()...

    beanstalk通讯协议

    Tube是Beanstalk中的一个重要概念,它允许将jobs分类存储,实现更灵活的任务调度。每个tube包含一个ready队列和一个delay队列。 - **Tube**:系统可以存在一个或多个tube。每个tube对应一组job。 - **Watch/Ignore**...

    Spring中Scope为Request和Session的Bean了.docx

    这两个Bean都继承自`HelloMessageGenerator`类,并且分别使用了`@RequestScope`和`@SessionScope`注解来指定它们的作用域。 1. `@RequestScope`:这个注解表示Bean的生命周期与每个HTTP请求关联。每当一个新的HTTP...

    基于java的企业级应用开发:Bean的装配方式.ppt

    例如,如果一个Bean的属性类型与容器中另一个Bean的类型匹配,Spring将自动注入那个Bean。当有多个匹配的Bean时,可以结合`@Qualifier`来指定特定的Bean名称。 总结,Bean的装配在Spring框架中扮演着重要角色,无论...

    spring注解开发--Bean加载控制.zip

    `@Lazy`注解允许你标记一个bean为懒加载。这意味着bean只有在实际被请求时才会初始化,而不是在容器启动时就创建。 5. **@Autowired** 自动装配是Spring的一个重要特性,`@Autowired`注解用于自动将依赖注入到...

    Spring实战之Bean的作用域singleton和prototype用法分析

    在Spring框架中,Bean的作用域是决定如何管理和创建Bean实例的关键概念。本篇文章将深入探讨两种主要的作用域:singleton和...理解并正确使用这两个作用域,能够帮助开发者更有效地设计和管理Spring应用中的Bean。

    spring中bean id相同引发故障的分析与解决

    当我们在配置文件或使用注解定义多个Bean时,如果它们的`id`相同,就会出现冲突,导致Spring容器无法正常初始化,从而引发故障。本文将深入探讨Spring中bean id重复的问题,以及如何解决这个问题。 首先,我们要...

    Bean Compare-开源

    在实际开发中,我们可能需要比较两个Bean对象是否相等,而这往往涉及到深度比较,即不仅比较对象自身的属性,还要比较属性所引用的对象。Bean Compare工具正是为了解决这一问题而设计的。 "开源软件"的标签表明Bean...

    Java开发学习(三)----Bean基础配置及其作用范围.doc

    在上述代码中,`AppForScope`类的main方法验证了这一点,通过比较两次获取的bean对象的内存地址,发现它们是相同的。 - **原型(prototype)**:当scope设置为`prototype`时,每次请求都会创建一个新的bean实例。这...

Global site tag (gtag.js) - Google Analytics