最近项目中,反复需要用到比较两个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;
}
分享到:
相关推荐
如果一个BeanA依赖于另一个BeanB,同时BeanB也依赖于BeanA,那么Spring在处理依赖关系时可能会陷入循环引用,导致两个Bean都实例化两次。 3. **@PostConstruct与初始化回调**:Spring允许我们在Bean初始化后执行...
在给定的"Java EJB中有、无状态SessionBean的两个例子"压缩包中,可能包含了以下内容: - 有状态SessionBean示例:可能包含一个实现SSB的Java类,以及对应的接口。这个类会覆盖一些方法来处理客户端的请求,并在...
利用java反射达到两个不同bean字段名相同,类型不相同的字段相互赋值的转换函数
4. **@Qualifier注解**:如果还有多个bean,且没有`@Primary`,Spring会检查`@Autowired`注解是否带有`@Qualifier`,并根据指定的bean名称进一步筛选。 5. **索引**:如果以上方式都无法确定唯一bean,那么可以为...
压缩包中的例子可能包含了两个项目,分别演示了无状态和有状态Session Bean的实现。无状态的例子可能展示了一个简单的计算器服务,每次调用方法时只基于当前参数执行计算,而不关心之前的操作。有状态的例子可能是一...
首先,BeanMapper的核心功能是将一个对象的属性值复制到另一个对象,即使这两个对象的结构不同。这种转换对于数据模型间的映射非常有用,例如在业务逻辑层和数据访问层之间,或者在API响应与内部模型之间。 在描述...
此外,通过`property`标签注入依赖,如`teacher`字段,使用`ref`属性引用另一个Bean。这种方式需要Bean有对应的setter方法,以便Spring进行依赖注入。 ```xml <bean id="student" class="test.Student"> 张三"/>...
在这个例子中,`AppConfig`类被标记为配置类,`myService()`和`myRepository()`方法分别声明了两个Bean。每个`@Bean`方法都会被Spring调用一次,以创建对应的Bean实例。 **依赖注入**:在Java配置中,依赖注入可以...
7. **@PostConstruct** 和 **@PreDestroy**:这两个注解标记的方法会在Bean初始化后和销毁前执行,用于执行特定的初始化或清理操作。 8. **@Configuration** 和 **@Bean**:这两个注解通常一起使用,用以替代XML...
BeanDiff是一个简单的库,用于使用反射比较两个对象。 这些对象不必具有相同的类型。 BeanDiff查找匹配的字段名称并比较值。 ##用法 A a = new A (); a . setName( " Hello " ); B b = new B (); b . set...
在本示例中,我们使用了一个嵌套循环来遍历LIST,并检查每个元素是否存在重复,如果存在,则合并这两个元素。 下面是相关知识点的总结: 1. Java中的LIST合并:Java提供了多种方式来合并LIST,包括使用addAll()...
Tube是Beanstalk中的一个重要概念,它允许将jobs分类存储,实现更灵活的任务调度。每个tube包含一个ready队列和一个delay队列。 - **Tube**:系统可以存在一个或多个tube。每个tube对应一组job。 - **Watch/Ignore**...
这两个Bean都继承自`HelloMessageGenerator`类,并且分别使用了`@RequestScope`和`@SessionScope`注解来指定它们的作用域。 1. `@RequestScope`:这个注解表示Bean的生命周期与每个HTTP请求关联。每当一个新的HTTP...
例如,如果一个Bean的属性类型与容器中另一个Bean的类型匹配,Spring将自动注入那个Bean。当有多个匹配的Bean时,可以结合`@Qualifier`来指定特定的Bean名称。 总结,Bean的装配在Spring框架中扮演着重要角色,无论...
`@Lazy`注解允许你标记一个bean为懒加载。这意味着bean只有在实际被请求时才会初始化,而不是在容器启动时就创建。 5. **@Autowired** 自动装配是Spring的一个重要特性,`@Autowired`注解用于自动将依赖注入到...
在Spring框架中,Bean的作用域是决定如何管理和创建Bean实例的关键概念。本篇文章将深入探讨两种主要的作用域:singleton和...理解并正确使用这两个作用域,能够帮助开发者更有效地设计和管理Spring应用中的Bean。
当我们在配置文件或使用注解定义多个Bean时,如果它们的`id`相同,就会出现冲突,导致Spring容器无法正常初始化,从而引发故障。本文将深入探讨Spring中bean id重复的问题,以及如何解决这个问题。 首先,我们要...
在实际开发中,我们可能需要比较两个Bean对象是否相等,而这往往涉及到深度比较,即不仅比较对象自身的属性,还要比较属性所引用的对象。Bean Compare工具正是为了解决这一问题而设计的。 "开源软件"的标签表明Bean...
在上述代码中,`AppForScope`类的main方法验证了这一点,通过比较两次获取的bean对象的内存地址,发现它们是相同的。 - **原型(prototype)**:当scope设置为`prototype`时,每次请求都会创建一个新的bean实例。这...