zoukankan      html  css  js  c++  java
  • 反射获取本类和父类所有属性,并根据注解校验属性

    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;
          }
      }
  • 相关阅读:
    最实用的logback讲解(2)—appender
    深入理解lombok
    idea(三)最值得安装的几款插件
    idea(二)初次安装强烈建议修改的配置
    swagger2的使用和swagger2markup离线文档的生成(最简单的方式)
    maven(一) 基础知识
    maven(二)pom文件详解
    ubuntu下jdk的安装
    maven(三)最详细的profile的使用
    profile之springboot
  • 原文地址:https://www.cnblogs.com/yuming2018/p/14148130.html
Copyright © 2011-2022 走看看