code: public static CustomPropertyDescriptor[] getPropertyDescriptors(Class<?> clazz) throws NullPointerException {
          if (clazz == null) {
              throw new NullPointerException("clazz为null");
          }
          // 首先从缓存中检查
          CustomPropertyDescriptor[] descriptors = CACHE.get(clazz);
          if (descriptors != null) {
              log.debug("获取Class {} 的说明时发现缓存中有，取出缓存中的说明返回", clazz);
              return descriptors;
          }
  
          Field[] fields = getAllFields(clazz);
  
          descriptors = new CustomPropertyDescriptor[fields.length];
          if (fields.length == 0) {
              log.debug("源{}中不存在已经声明的字段", clazz.getName());
              CACHE.put(clazz, descriptors);
              return descriptors;
          }
  
          int j = 0;
          for (Field field : fields) {
              CustomPropertyDescriptor descriptor = buildDescriptor(field, clazz);
              if (descriptor != null) {
                  descriptors[j++] = descriptor;
              }
          }
  
          if (j < descriptors.length) {
              log.debug("构建构成中发生了异常，数组中有null，除去null");
              CustomPropertyDescriptor[] propertyDescriptor = new CustomPropertyDescriptor[j];
              System.arraycopy(descriptors, 0, propertyDescriptor, 0, j);
              CACHE.put(clazz, propertyDescriptor);
              return propertyDescriptor;
          } else {
              log.debug("构建没有异常，构建成功");
              CACHE.put(clazz, descriptors);
              return descriptors;
          }
      }
docs: 获取指定Class的字段说明
  
  @param clazz 指定的class
  @return 指定class的字段说明（数组中不会有null）
  @throws NullPointerException clazz为null时抛出该异常