docs: String getAttributeName(Method getter) {
          String attributeName;
          readLockAttrName.lock();
          try {
              attributeName = attributeNameCache.get(getter);
          } finally {
              readLockAttrName.unlock();
          }
          if ( attributeName != null )
              return attributeName;
          DynamoDBHashKey hashKeyAnnotation = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBHashKey.class);
          if ( hashKeyAnnotation != null ) {
              attributeName = hashKeyAnnotation.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          DynamoDBIndexHashKey indexHashKey = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBIndexHashKey.class);
          if ( indexHashKey != null ) {
              attributeName = indexHashKey.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          DynamoDBRangeKey rangeKey = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBRangeKey.class);
          if ( rangeKey != null ) {
              attributeName = rangeKey.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          DynamoDBIndexRangeKey indexRangeKey = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBIndexRangeKey.class);
          if ( indexRangeKey != null ) {
              attributeName = indexRangeKey.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          DynamoDBAttribute attribute = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBAttribute.class);
          if ( attribute != null ) {
              attributeName = attribute.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          DynamoDBVersionAttribute version = ReflectionUtils.getAnnotationFromGetterOrField(getter, DynamoDBVersionAttribute.class);
          if ( version != null ) {
              attributeName = version.attributeName();
              if ( attributeName != null && attributeName.length() > 0 )
                  return cacheAttributeName(getter, attributeName);
          }
          // Default to the camel-cased field name of the getter method, inferred
          // according to the Java naming convention.
          attributeName = ReflectionUtils.getFieldNameByGetter(getter, true);
          return cacheAttributeName(getter, attributeName);
      }