簡體   English   中英

Java-使用反射的比較字段

[英]Java - comparision fields using reflection

我需要比較兩個對象的所有字段並返回差異數。

偽代碼如下所示:

public int differentFields(Foo foo1, Foo foo2) {
    int differentFields = 0;
   for all fields of foo1 and foo2:
       if foo1.field[i] != foo2.field[i]
           differentFields++;

   return differentFields;
}

字段具有相同的名稱,因為我想比較同一類的對象。

我不能使用標准等於來做到這一點,因為Foo有很多字段,而if語句我不得不寫太多。

如何使用反射來做到這一點?

如評論中所述,使用反射來獲取所有類成員是一個壞主意 這應該可以解決您的要求:

public <T> int countDiff(T t1, T t2) throws Exception {
    int diffCount = 0;
    Class<? extends Object> tClass = t1.getClass();
    for (Field field : tClass.getDeclaredFields()) {
        field.setAccessible(true);
        Object value1 = field.get(t1);
        Object value2 = field.get(t2);
        if (!isEqual(value1, value2)) {
            diffCount++;
        }
    }
    return diffCount;
}

private boolean isEqual(Object v1, Object v2) {
    return (v1 == null && v2 == null) || (v1 != null && v1.equals(v2));
}

一個更好的安靜解決方案是遍歷吸氣劑(但這仍然不是一個好主意:

public <T> int countDiff(T t1, T t2) throws Exception {
    int diffCount = 0;
    Class<? extends Object> tClass = t1.getClass();
    for (Method method : tClass.getMethods()) {
        if (!isGetter(method)) {
            continue;
        }
        Object value1 = method.invoke(t1);
        Object value2 = method.invoke(t2);
        if (!isEqual(value1, value2)) {
            diffCount++;
        }
    }
    return diffCount;
}

private boolean isGetter(Method m) {
    boolean name = m.getName().startsWith("get") || m.getName().startsWith("is");
    return name && m.getParameterTypes().length == 0 && m.getReturnType() != Void.TYPE;
}

private boolean isEqual(Object v1, Object v2) {
    return (v1 == null && v2 == null) || (v1 != null && v1.equals(v2));
}

編輯感謝@tobias_k:也is增加了對布爾方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM