0
点赞
收藏
分享

微信扫一扫

java 校验两个相同对象是否存在包含关系

在Java中,如果你想校验一个对象(A对象)是否包含另一个对象(B对象)的所有字段值,可以通过反射机制来实现这一点。具体来说,你需要遍历B对象的所有字段,并检查这些字段的值是否与A对象中的相应字段值相同。

下面是一个示例实现:

import java.lang.reflect.Field;

class SysUser {
    private String userName;
    private String nickName;
    
    // Getters and Setters
    public String getUserName() {
        return userName;
    }
    
    public void setUserName(String userName) {
        this.userName = userName;
    }
    
    public String getNickName() {
        return nickName;
    }
    
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
}

public class Main {
    public static void main(String[] args) {
        // 创建两个对象
        SysUser obj1 = new SysUser();
        obj1.setUserName("用户");
        obj1.setNickName("测试");
        
        SysUser obj2 = new SysUser();
        obj2.setUserName("用户");
        
        // 判断obj1是否包含obj2的所有字段值
        boolean containsAllFields = doesObjectContainAllFields(obj1, obj2);
        System.out.println("Object A contains all fields of Object B: " + containsAllFields);
    }

    public static boolean doesObjectContainAllFields(Object container, Object contained) {
        if (container == null || contained == null) {
            return false;
        }
        if (!container.getClass().equals(contained.getClass())) {
            return false;
        }

        Field[] fields = contained.getClass().getDeclaredFields();
        try {
            for (Field field : fields) {
                field.setAccessible(true); // 使私有属性也可以访问
                Object value1 = field.get(container);
                Object value2 = field.get(contained);
                if (value2 != null){
                    if (!value1.equals(value2)){
                        return false;
                    }
                }
            }
            return true;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
            return false;
        }
    }
}

解释

  1. SysUser 类:定义了一个简单的用户类,包含用户名 (userName) 和昵称 (nickName) 两个字段。
  2. main 方法:创建了两个 SysUser 对象 obj1 和 obj2,并设置了部分字段值。
  3. doesObjectContainAllFields 方法
  • 首先检查两个对象是否为 null,或者是否属于不同的类。
  • 使用反射获取 contained 对象的所有字段。
  • 遍历这些字段,将 contained 对象的字段值与 container 对象的相应字段值进行比较。
  • 如果 contained 对象的某个字段值不等于 container 对象的相应字段值,则返回 false
  • 如果所有字段值都匹配,则返回 true
举报

相关推荐

0 条评论