• 反射获取本类和父类所有属性,并根据注解校验属性


    1. getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。

    2. getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。

    3. 同样类似的还有getConstructors()和getDeclaredConstructors()、getMethods()和getDeclaredMethods(),这两者分别表示获取某个类的方法、构造函数。
    4. 获取到当前类以及父类的所有属性
      /**
           * 获取本类及其父类的属性
           * @param clazz 当前类对象
           * @return 字段数组
           */
          private static List<Field> getAllFields(Class<?> clazz) {
              List<Field> fieldList = new ArrayList<>();
              while (clazz != null){
                  fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
                  clazz = clazz.getSuperclass();
              }
              return fieldList;
          }
    5. 校验属性
      public class EasyExcelValidHelper {
      
          private EasyExcelValidHelper(){}
      
          private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
      
          public static <T> String validateEntity(T obj) throws Exception {
              StringBuilder result = new StringBuilder();
              Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
              if (set != null && !set.isEmpty()) {
                  for (ConstraintViolation<T> cv : set) {
                      Optional<Field> fieldOptional = getAllFields(obj.getClass())
                              .stream().filter(i -> cv.getPropertyPath().toString().equals(i.getName())).findAny();
                      if (fieldOptional.isPresent()) {
                          Field declaredField = fieldOptional.get();
                          ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
                          //拼接错误信息,包含当前出错数据的标题名字+错误信息
                          result.append(annotation.value()[0]).append(cv.getMessage()).append(";");
                      }else{
                          throw new RuntimeException("系统异常");
                      }
                  }
              }
              return result.toString();
          }
          /**
           * 获取本类及其父类的属性
           * @param clazz 当前类对象
           * @return 字段数组
           */
          private static List<Field> getAllFields(Class<?> clazz) {
              List<Field> fieldList = new ArrayList<>();
              while (clazz != null){
                  fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
                  clazz = clazz.getSuperclass();
              }
              return fieldList;
          }
      }
  • 相关阅读:
    unity打包iOS上线归纳
    unity update优化
    3dmax 法线重置
    unity2017分离动作
    unity5 manifest
    Unity5 AssetBundle资源管理架构设计
    ue4 tags 与 cast
    3dmax tcb控制器
    ue4 创建简易动画
    即时战略游戏中实用的寻路算法都有哪些,比较如何?
  • 原文地址:https://www.cnblogs.com/yuming2018/p/14148130.html
Copyright © 2020-2023  润新知