反射獲取本類和父類所有屬性,並根據注解校驗屬性


  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;
        }
    }

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM