code: @GwtIncompatible("incompatible method")
      public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final Object object,
              final boolean testTransients) {
          return reflectionHashCode(initialNonZeroOddNumber, multiplierNonZeroOddNumber, object, testTransients, null);
      }
docs: <p>
  Uses reflection to build a valid hash code from the fields of {@code object}.
  </p>
  
  <p>
  It uses <code>AccessibleObject.setAccessible</code> to gain access to private fields. This means that it will
  throw a security exception if run under a security manager, if the permissions are not set up correctly. It is
  also not as efficient as testing explicitly.
  </p>
  
  <p>
  If the TestTransients parameter is set to <code>true</code>, transient members will be tested, otherwise they
  are ignored, as they are likely derived fields, and not part of the value of the <code>Object</code>.
  </p>
  
  <p>
  Static fields will not be tested. Superclass fields will be included.
  </p>
  
  <p>
  Two randomly chosen, non-zero, odd numbers must be passed in. Ideally these should be different for each class,
  however this is not vital. Prime numbers are preferred, especially for the multiplier.
  </p>
  
  @param initialNonZeroOddNumber
  a non-zero, odd number used as the initial value. This will be the returned
  value if no fields are found to include in the hash code
  @param multiplierNonZeroOddNumber
  a non-zero, odd number used as the multiplier
  @param object
  the Object to create a <code>hashCode</code> for
  @param testTransients
  whether to include transient fields
  @return int hash code
  @throws IllegalArgumentException
  if the Object is <code>null</code>
  @throws IllegalArgumentException
  if the number is zero or even
  
  @see HashCodeExclude