Java等于第三部分类的可配置字段数

Java等于第三部分类的可配置字段数,java,Java,我必须实现一个测试对象相等性的方法,如下所示 isEqual(MyClass o1, MyClass o2, List<String> fieldNames) isEqual(MyClass o1、MyClass o2、列表字段名) 这里的列表字段名是MyClass的实例变量,应该考虑这些变量是否相等 isEqual方法将从具有不同“字段名集”的不同代码路径调用 我查看了Apache EqualBuilder,但它没有提供我正在寻找的类似功能 有什么建议吗?试试MyClass.c

我必须实现一个测试对象相等性的方法,如下所示

isEqual(MyClass o1, MyClass o2, List<String> fieldNames)
isEqual(MyClass o1、MyClass o2、列表字段名)
这里的
列表字段名
MyClass
的实例变量,应该考虑这些变量是否相等

isEqual
方法将从具有不同“
字段名集
”的不同代码路径调用

我查看了Apache EqualBuilder,但它没有提供我正在寻找的类似功能


有什么建议吗?

试试
MyClass.class.getDeclaredFields()

这将得到一个类中所有字段的列表。您可以使用
field.getName()
来获取其
字符串
-name

接下来在
isEqual()
中,您可以使用
MyClass.class.getField(fieldName)
来获取字段。使用
field.get(myClass)
可以获取某个实例的此字段的值

虽然我没有传递字段名,而是传递
字段[]
。这将跳过将
字段
转换为
字符串
,然后再转换回
字段

如果您想进一步了解这一点,请看一下Java

祝你好运

示例

boolean isEqual(MyClass obj1, MyClass obj2, Field[] fields) {
    for(Field field : fields)
        if(!field.get(obj1).equals(field.get(obj2)))
            return false;
    return true;
}
称之为:

Class cls = MyClass.class;
isEqual(obj1, obj2, { cls.get("myField"), cls.get("anotherField") });

如果没有用于比较的预定义字段(案例)集合,则必须使用反射。然而,这将导致巨大的开销,特别是如果要经常执行此操作

然而,如果您确实有某些比较场景,我建议为每种情况创建自定义比较器

例如:

public interface MyComparator {
    boolean areEqual(MyClass class1, MyClass class2);
}
以及一些场景实现:

public class MyNamesComparator implements MyComparator {
    public boolean areEqual(MyClass class1, MyClass class2) {
        return class1.getNames().equals(class2.getNames());
    }
}
在业务逻辑类中:

public boolean areEqual(MyClass class1, MyClass class2, Class<? extends MyComparator> comparatorClass) {
   return comparatorClass.newInstance().areEqual(class1, class2);
}

公共布尔值等于(MyClass class1、MyClass class2、class2这会起作用,但您不会暴露这会导致的性能问题;此外,类没有“get”方法;您的意思是getFieldWell,这似乎是OP要求的情况。我怀疑他想基于UI生成字段列表。这意味着编写自定义
比较器
s而不使用反省是不可能的。无论哪种情况,OP都需要认真考虑后果。我真的不认为可以有一个比较任何领域的场景,不管是在UI中。无论是在UI中,还是比较小的,MyClass都有15个字段,而我将MyClass暴露给其他开发者来提供数据给我的代码。字段向我发送数据。我需要找出他们最近发送的数据是否与上次发送的数据不同。这就是为什么我想从他们那里获取一个字段列表,并使用这些字段来比较MyClass的cur和prev实例。替代方法是让他们中的每一个人编写自定义比较表MyClass的任务大纲