反射获取类属性上的注解

在工作中用到easyexcel,有一个上传文件的功能,新模板比旧模板多了一列,因此产生当使用之前的旧模板时要拒掉,不能向下执行

程序中映射的实体类使用@ExcelProperty(value = "*二维码编号", index = 0)注解,用于标识excel文件列的顺序。

针对这个功能首先要获取实体类的属性上注解的内容,将内容与表头内容进行匹配。

public static void main(String[] args) {
        //获取单表头的实体类顺序
        Class clazz = QrcodeUpdateParamsDto.class;
        //获取类的所有属性
        Field[] declaredFields = clazz.getDeclaredFields();
        List<FieldExcelProperty> fieldExcelPropertyList = new ArrayList<>();
        FieldExcelProperty fieldExcelProperty = null;
        for (Field field: declaredFields) {
            System.out.println(field.toString());
            ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
            if (annotation != null) {
                fieldExcelProperty = new FieldExcelProperty();
                fieldExcelProperty.setIndex(annotation.index());
                fieldExcelProperty.setValue(annotation.value());
                fieldExcelPropertyList.add(fieldExcelProperty);
                fieldExcelProperty = null;
            }
        }
        if (!fieldExcelPropertyList.isEmpty()) {
            //利用拉姆达表达式,进行排序,将排序后的结果输出为list

        }
    }

自定义内部类,用于保存属性上注解的值

class FieldExcelProperty{
    private int index;
    private String[] value;

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String[] getValue() {
        return value;
    }

    public void setValue(String[] value) {
        this.value = value;
    }
}

这样将实体类转换为表头信息,再与读取到的excel表头做对比,headList为实体类对应的属性集合。

 @Override
  public void invokeHeadMap(Map headMap, AnalysisContext context) {
    if (context.readRowHolder().getRowIndex() == 0) {
      for (int i = 0; i < headList.length; i++) {
        try {
          if (null != headMap &&
              null != headMap.get(i) &&
              !headMap.get(i).equals(headList[i])) {
            throw new ExcelAnalysisException("上传模板与系统模板不匹配,请使用平台模板上传数据");
          }
        } catch (Exception e) {
          throw new ExcelAnalysisException(e.getMessage());
        }
      }
    }

  }

如果对比不一致,就会拒绝。

posted @ 2021-12-24 15:08  小拾柒~  阅读(1081)  评论(0编辑  收藏  举报