public static <T> boolean comparePublicNonFinalFields(@NotNull T first, @NotNull T second) {
    Class<?> defaultClass = first.getClass();
    Field[] fields = defaultClass.getDeclaredFields();
    if (defaultClass != second.getClass()) {
      fields = ArrayUtil.mergeArrays(fields, second.getClass().getDeclaredFields());
    }
    for (Field field : fields) {
      if (!isPublic(field) || isFinal(field)) {
        continue;
      }

      field.setAccessible(true);
      try {
        if (!Comparing.equal(field.get(second), field.get(first))) {
          return false;
        }
      }
      catch (IllegalAccessException e) {
        throw new RuntimeException(e);
      }
    }
    return true;
  }
public static <T> boolean comparePublicNonFinalFields(@NotNull T first, @NotNull T second)