反射获取类属性上的注解
在工作中用到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()); } } } }
如果对比不一致,就会拒绝。