簡體   English   中英

如何在不知道Java中枚舉類型的情況下使用Reflection比較多個枚舉?

[英]How to compare multiple enums using Reflection without know the enum type in Java?

我的項目有多個枚舉,有些類的屬性有多個枚舉。 我需要創建一個日志,以在編輯對象時顯示以前的值和新的值。 我知道可以將普通字段比較為String,Integer等...,但是我無法使用enum做到這一點。

我正在以這種方式進行比較,但並未使用枚舉:

public static Map<Object, List<Object>> compareObjects(Object a, Object b){
 ...Some varibles declaration
  Field[] fieldsA a.getClass().getDeclaredFields();
  Field[] fieldsB b.getClass().getDeclaredFields();

int i = 0;
 for(; i < a.length; i++){
    ...some codintions
    if(fieldsA[i].get(a).equals(fieldsB[i].get(b)){

    ...

這是處理枚舉的一種方法:

Object v1 = fields1[i].get(o1);
Object v2 = fields2[i].get(o2);
if (fields1[i].getType().isEnum()) {
    v1 = fields1[i].getType().getName() + '#' + v1;
}
if (fields2[i].getType().isEnum()) {
    v2 = fields2[i].getType().getName() + '#' + v2;
}

if (v1.equals(v2)) {
    System.out.println("Field #" + i + " matches");
}
else {
    System.out.println("Field #" + i + " changed from \"" + v1 + "\" to \"" + v2);
}

例如,給定這些枚舉:

enum Color { Red, Green, Blue; }
enum RGB { Red, Green, Blue; }

Color.Red字段與RGB.Red字段進行比較將失敗,因為實際比較的是“ Color#Red”和“ RGB#Red”。

也就是說,您可能還有更大的問題。 getDeclaredFields()的文檔說:

返回的數組中的元素未排序,並且沒有任何特定順序。

因此,您可以比較兩個等效的對象,但是如果getDeclaredFields以不同的順序返回字段,則測試將失敗。 至少,您需要按getName()對字段進行排序,以便具有一致的順序。 另外,在比較值之前先比較名稱,以使您知道將x與'x'而不是xy

暫無
暫無

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

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