[英]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'而不是x
與y
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.