code: public static CustomPropertyDescriptor buildDescriptor(Field field, Class<?> clazz) {
          FieldCache fieldCache = new FieldCache(field, clazz);
  
          // 首先检查缓存
          if (FIELD_DESC_CACHE.containsKey(fieldCache)) {
              return FIELD_DESC_CACHE.get(fieldCache);
          }
  
          String name = field.getName();
  
          CustomPropertyDescriptor customPropertyDescriptor = null;
          try {
              if (isFinal(field)) {
                  log.debug("字段{}是final类型，尝试为该字段创建说明", name);
                  customPropertyDescriptor = tryBuildFinal(field, clazz);
              } else {
                  log.debug("字段不是final类型，开始构建字段{}的说明", name);
                  customPropertyDescriptor = convert(field, new PropertyDescriptor(name, clazz),
                      clazz);
              }
          } catch (IntrospectionException e) {
              //挣扎一下，尝试自己构建（针对继承方法有效）
              log.info("尝试自定义构建PropertyDescriptor");
              Method readMethod;
              Method writeMethod = null;
              String methodName = StringUtils.toFirstUpperCase(name);
              readMethod = getMethod("get" + methodName, clazz);
  
              if (readMethod == null) {
                  readMethod = getMethod("is" + methodName, clazz);
              }
  
              if (readMethod != null) {
                  writeMethod = getMethod("set" + methodName, clazz, readMethod.getReturnType());
              }
  
              if (writeMethod == null) {
                  log.warn("说明构建失败，忽略{}字段", field.getName(), e);
              } else {
                  log.info("自定义构建PropertyDescriptor成功");
                  try {
                      customPropertyDescriptor = convert(field,
                          new PropertyDescriptor(name, readMethod, writeMethod), clazz);
                  } catch (IntrospectionException e1) {
                      log.info("构建失败，忽略字段[{}]", field.getName(), e1);
                  }
              }
          }
  
          FIELD_DESC_CACHE.put(fieldCache, customPropertyDescriptor);
          return customPropertyDescriptor;
      }
docs: 构建指定字段的说明
  
  @param field 字段
  @param clazz 该字段所属的class
  @return 该字段的说明，构建异常时返回null