Вы можете использовать отражение в качестве обходного пути для вашей проблемы, но лучший способ сделать это будет, как сказал @imperezivan, с использованием общего предка, чтобы атрибуты были в одном месте.
Реализация отражения будетбыть так же просто, как получить все поля каждого объекта, и сравнить его значения.Вот вам пример:
public static boolean compareObjects(Object o1, Object o2) {
try {
List<Field> fields1 = getFields(o1);
List<Field> fields2 = getFields(o2);
boolean found;
Field field2Temp = null;
for (Field field1 : fields1) {
found = false;
for (Field field2 : fields2) {
if (field1.getName().equals(field2.getName())) {
if (!field1.get(o1).equals(field2.get(o2))) {
System.out.println("Value " + field1.get(o1) + " for field " + field1 + " does not match the value " + field2.get(o2) + " for field " + field2);
return false;
}
field2Temp = field2;
found = true;
}
}
if (!found) {
System.out.println("Field " + field1 + " has not been found in the object " + o2.getClass());
return false;
} else {
fields2.remove(field2Temp);
}
}
if (fields2.size() > 0) {
for (Field field : fields2) {
System.out.println("Field " + field + " has not been found in the object " + o1.getClass());
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private static List<Field> getFields(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
}
return new ArrayList<>(Arrays.asList(fields));
}
Как вы видите, я заставляю поля соответствовать, поэтому, если одно поле не найдено в другом объекте, метод вернет false, но вы можете легкоизмените его в зависимости от ваших потребностей.
Этот код дает некоторые подробности о том, где проблема, если два объекта различны.
При таком выполнении:
public static void main(String args[]){
Bean1 bean1 = new Bean1(1);
Bean2 bean2 = new Bean2(1);
System.out.println("Equals? " + bean1.equals(bean2));
System.out.println("Reflection equals? " + compareObjects(bean1, bean2));
bean2 = new Bean2(2);
System.out.println("Equals? " + bean1.equals(bean2));
System.out.println("Reflection equals? " + compareObjects(bean1, bean2));
}
РезультатыВы получаете:
Equals? false
Reflection equals? true
Equals? false
Value 1 for field private int com.test.so.Bean1.id does not match the value 2 for field private int com.test.so.Bean2.id
Reflection equals? false
Если вы планируете использовать этот код, пожалуйста, проверьте крайние случаи, так как я этого еще не сделал