docs: public static List<FieldInfo> processDefaultValue(List<Field> fields) {
          if (fields == null) {
              return null;
          }
  
          List<FieldInfo> ret = new ArrayList<FieldInfo>(fields.size());
  
          int maxOrder = 0;
          List<FieldInfo> unorderFields = new ArrayList<FieldInfo>(fields.size());
          for (Field field : fields) {
              Protobuf protobuf = field.getAnnotation(Protobuf.class);
              if (protobuf == null) {
                  throw new RuntimeException("Field '" + field.getName() + "' has no @Protobuf annotation");
              }
  
              // check field is support for protocol buffer
              // any array except byte array is not support
              String simpleName = field.getType().getName();
              if (simpleName.startsWith("[")) {
                  if ((!simpleName.equals(byte[].class.getName())) && (!simpleName.equals(Byte[].class.getName()))) {
                      throw new RuntimeException("Array type of field '" + field.getName() + "' on class '"
                              + field.getDeclaringClass().getName() + "' is not support,  please use List instead.");
                  }
              }
  
              FieldInfo fieldInfo = new FieldInfo(field);
              fieldInfo.setRequired(protobuf.required());
              fieldInfo.setDescription(protobuf.description());
  
              // process type
              if (protobuf.fieldType() == FieldType.DEFAULT) {
                  FieldType fieldType = TYPE_MAPPING.get(field.getType());
                  if (fieldType == null) {
                      // check if type is enum
                      if (Enum.class.isAssignableFrom(field.getType())) {
                          fieldType = FieldType.ENUM;
                      } else {
                          fieldType = FieldType.OBJECT;
                      }
                  }
                  fieldInfo.setFieldType(fieldType);
              } else {
                  fieldInfo.setFieldType(protobuf.fieldType());
              }
  
              int order = protobuf.order();
              if (order > 0) {
                  fieldInfo.setOrder(order);
                  if (order > maxOrder) {
                      maxOrder = order;
                  }
              } else {
                  unorderFields.add(fieldInfo);
              }
  
              ret.add(fieldInfo);
          }
  
          if (unorderFields.isEmpty()) {
              return ret;
          }
  
          for (FieldInfo fieldInfo : unorderFields) {
              maxOrder++;
              fieldInfo.setOrder(maxOrder);
  
              LOGGER.warning("Field '" + fieldInfo.getField().getName() + "' from "
                      + fieldInfo.getField().getDeclaringClass().getName()
                      + " with @Protobuf annotation but not set order or order is 0," + " It will set order value to "
                      + maxOrder);
          }
  
          return ret;
      }