code: private static void reflectionAppend(final Object object, final Class<?> clazz, final HashCodeBuilder builder, final boolean useTransients,
              final String[] excludeFields) {
          if (isRegistered(object)) {
              return;
          }
          try {
              register(object);
              final Field[] fields = clazz.getDeclaredFields();
              AccessibleObject.setAccessible(fields, true);
              for (final Field field : fields) {
                  if (false == ArrayUtil.contains(excludeFields, field.getName())
                      && (field.getName().indexOf('$') == -1)
                      && (useTransients || !Modifier.isTransient(field.getModifiers()))
                      && (!Modifier.isStatic(field.getModifiers()))) {
                      try {
                          final Object fieldValue = field.get(object);
                          builder.append(fieldValue);
                      } catch (final IllegalAccessException e) {
                          // this can't happen. Would get a Security exception instead
                          // throw a runtime exception in case the impossible happens.
                          throw new InternalError("Unexpected IllegalAccessException");
                      }
                  }
              }
          } finally {
              unregister(object);
          }
      }
docs: <p>
  Appends the fields and values defined by the given object of the given <code>Class</code>.
  </p>
  
  @param object
  the object to append details of
  @param clazz
  the class to append details of
  @param builder
  the builder to append to
  @param useTransients
  whether to use transient fields
  @param excludeFields
  Collection of String field names to exclude from use in calculation of hash code