code: public static FieldInfo of(Field field) {
      if (field == null) {
        return null;
      }
      synchronized (CACHE) {
        FieldInfo fieldInfo = CACHE.get(field);
        boolean isEnumContant = field.isEnumConstant();
        if (fieldInfo == null && (isEnumContant || !Modifier.isStatic(field.getModifiers()))) {
          String fieldName;
          if (isEnumContant) {
            // check for @Value annotation
            Value value = field.getAnnotation(Value.class);
            if (value != null) {
              fieldName = value.value();
            } else {
              // check for @NullValue annotation
              NullValue nullValue = field.getAnnotation(NullValue.class);
              if (nullValue != null) {
                fieldName = null;
              } else {
                // else ignore
                return null;
              }
            }
          } else {
            // check for @Key annotation
            Key key = field.getAnnotation(Key.class);
            if (key == null) {
              // else ignore
              return null;
            }
            fieldName = key.value();
            field.setAccessible(true);
          }
          if ("##default".equals(fieldName)) {
            fieldName = field.getName();
          }
          fieldInfo = new FieldInfo(field, fieldName);
          CACHE.put(field, fieldInfo);
        }
        return fieldInfo;
      }
    }
docs: Returns the field information for the given field.
  
  @param field field or {@code null} for {@code null} result
  @return field information or {@code null} if the field has no {@link #name} or for {@code null}
  input