利用java反射机制比较同一个bean的两个对象的值是否相同

本文探讨如何使用Java反射API来比较同一个Bean类的两个实例对象,检查它们的属性值是否完全相同。通过获取类的Field对象,设置访问权限并获取属性值,再进行比较,确保在不覆盖equals()和hashCode()方法的情况下也能实现对象的深度比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.lang.reflect.Field;
import java.math.BigDecimal;

public class CompareEntity {

 public static void main(String[] args) {

  Entity1 e1 = new Entity1();
  e1.setName("名字");
  e1.setAge(10);
  e1.setMoney(new BigDecimal("22222"));

  Entity1 e2 = new Entity1();

  //e2.setName("名字");
  e2.setAge(11);
  e2.setMoney(new BigDecimal("33333"));

  System.out.println("比较之前");
  System.out.println("name:"+e1.getName());
  System.out.println("age:"+e1.getAge());
  System.out.println("money:"+e1.getMoney());
  System.out.println("name:"+e2.getName());
  System.out.println("age:"+e2.getAge());
  System.out.println("money:"+e2.getMoney());
  System.out.println("-------------------");
  try {
   Compare.compare(e1, e2);
  } catch (Exception e) {
   e.printStackTrace();
  }
  System.out.println("-----------------------");
  System.out.println("比较之后");
  System.out.println("name:"+e1.getName());
  System.out.println("age:"+e1.getAge());
  System.out.println("money:"+e1.getMoney());
  System.out.println("name:"+e2.getName());
  System.out.println("age:"+e2.getAge());
  System.out.println("money:"+e2.getMoney());
 }
}

class Compare{
 public static void compare(Object src,Object target) throws Exception{
  Class<?> srcClass = src.getClass();
  Class<?> targetClass = target.getClass();
  Field[] e1Field = srcClass.getDeclaredFields();
  Field[] e2Field = targetClass.getDeclaredFields();
  for(int i=0;i<e1Field.length;i++){
   Field e1F = e1Field[i];
   Object o1 = srcClass.getMethod(getMethodName(e1F.getName())).invoke(src);
   for(int j=0;j<e2Field.length;j++){
    Field e2F = e2Field[j];
    if(e1F.getName().equals(e2F.getName())){
     Class<?> type1 = e1F.getType();
     Class<?> type2 = e2F.getType();
     if(!type1.equals(type2)){
      throw new RuntimeException("两个类型不一致");
     }
     Object o2 = targetClass.getMethod(getMethodName(e2F.getName())).invoke(target);
     if(o1 == null && o2 != null ){
      srcClass.getMethod(setMethodName(e1F.getName()),type1).invoke(src, o2);
     }
     if(o1 != null && o2 == null){
      targetClass.getMethod(setMethodName(e2F.getName()),type2).invoke(target,o1);
     }
     if(o1 != null && o2 != null & !o1.equals(o2)){
      System.out.println(o1 +" 不等于 "+ o2);
     }
    }
   }
  }
 }
 private static String getMethodName(String fieldName){
  return "get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1,fieldName.length());
 }
 private static String setMethodName(String fieldName){
  return "set"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1,fieldName.length());
 }
}


class Entity1{

 private String name;

 private int age;

 private BigDecimal money;

 public BigDecimal getMoney() {
  return money;
 }

 public void setMoney(BigDecimal money) {
  this.money = money;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值