java getclass 相等_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 map = new HashMap();

map = (HashMap) source;

for (String key : map.keySet()) {

if (target instanceof Map) {

HashMap tarMap = new HashMap();

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 tarMap = new HashMap();

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 

// 非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[]) {

}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,比较两个对象属性是否相等的最优算法取决于对象的类型和属性数量。假设比较对象类型是自定义的类,那么可以通过实现 `equals` 方法和 `hashCode` 方法来比较对象属性是否相等,这是 Java 中推荐的做法。 在实现 `equals` 方法时,通常需要比较对象的每一个属性是否相等,如果所有属性相等,则返回 `true`,否则返回 `false`。在比较每一个属性时,可以使用 Java 提供的 `Objects.equals(Object a, Object b)` 方法,该方法可以比较两个对象是否相等,避免了空指针异常。 同时,还需要实现 `hashCode` 方法来保证对象在放入 HashMap 或 HashSet 等容器时能够正确地存储和查找。 示例代码如下: ```java public class Person { private String name; private int age; // 省略构造方法和其他方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } } ``` 在上述代码中,`equals` 方法比较两个 `Person` 对象的 `name` 和 `age` 属性是否相等使用了 `Objects.equals` 方法进行比较,同时还重写了 `hashCode` 方法,使用了 `Objects.hash` 方法生成哈希。 如果比较对象类型是 Java 自带的类,如 `String`、`Integer` 等,通常可以直接使用 `equals` 方法进行比较,因为这些类已经实现了 `equals` 方法。但需要注意的是,如果使用 `==` 操作符比较两个对象比较的是对象的引用,而不是对象属性相等性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值