public ComparatorObject compareTo(Object obj1, Object obj2) { ComparatorObject comparatorObject = new ComparatorObject(obj1, obj2); ComparataroFieldPredicate comparataroFieldPredicate = new ComparataroFieldPredicate(); List<Field> fieldsObject1 = ReflectionUtils.getAllFieldToPredicate(obj1, comparataroFieldPredicate); List<Field> fieldsObject2 = ReflectionUtils.getAllFieldToPredicate(obj2, comparataroFieldPredicate); List<Field> commonsFields = ListUtils.intersection(fieldsObject1, fieldsObject2); processCommonsField(commonsFields, obj1, obj2, comparatorObject); List<Field> differentFieldsObj1 = ListUtils.subtract(fieldsObject1, fieldsObject2); List<Field> differentFieldsObj2 = ListUtils.subtract(fieldsObject2, fieldsObject1); comparatorObject.addAllFieldsObj1(getFieldsToObject(differentFieldsObj1, obj1)); comparatorObject.addAllFieldsObj2(getFieldsToObject(differentFieldsObj2, obj2)); return comparatorObject; }