code: private String generateAggregatedKey(final Object object) {
          // Store the aggregated key
          final StringBuilder sb = new StringBuilder();
  
          KeyGenerator methodGenerator;
          // Search for method annotation
          for (final Method m : object.getClass().getMethods()) {
              methodGenerator = m.getAnnotation(KeyGenerator.class);
  
              if (methodGenerator != null) {
                  Object returnedValue = null;
                  try {
                      returnedValue = m.invoke(object);
  
                  } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                      LOGGER.log(METHOD_KEY_GENERATOR_FAILURE, m.getName(), object.getClass().getSimpleName(), e);
                  }
                  if (returnedValue == null) {
                      // returned value is null
                      LOGGER.log(NULL_METHOD_KEY, m.getName(), object.getClass().getSimpleName());
                  } else {
                      sb.append(convertMethodKeyObject(methodGenerator, returnedValue));
                  }
  
              }
          }
          return sb.toString().isEmpty() ? null : sb.toString();
      }
docs: Generate unique key by using the method-level annotations.
  
  @param object the source object
  
  @return the unique key or null if an error occurred or no method annotation was found