zoukankan      html  css  js  c++  java
  • 编写自己的validate校验框架原理(转)

    原文链接:http://blog.csdn.net/a973893384/article/details/51517388

    具体思路:

      我们使用自定义注解实现。然后需要解决的是两个问题:

        1是如何扫描自定义注解

        2是如何扫描到自定义注解做出对应的validate校验

      第一个问题的解决方案:

        自定义一个AnnotationHelper类,该类可配置自定义注解的源文件的package路径。 

    AnnotationHelper{
      private static final String BASE_PAGE = "";
      private Map<Annotation,Class<? extends Annotation>> ANNOTATION_CLASS_SET = new HashMap<Annotation,Class<? extends Annotation>>();
    
      static(){
            loadAnnotation(BASE_PAGE);
        }
    
       
        private void loadAnnotation(){
            /**
            *扫描指定包下的Class文件,将得到的Annotation以及对应的Class对象注入ANNOTATION_CLASS_sET
            */
        }

      private static Annotation choice(Field field){
        //根据传入的field对象得到该field对象上面的validate注解,可拓展为得到Annotation[]
      }

      private static Class<? etxends Annotation> choice(Annotation annotation){
        //..
      }  }

    前面发现,AnnotationHelper类在加载前就会自动扫描注解包,将注解对应信息放入它的map中去,然后调用choice方法可以得到校验注解的对象信息和Class信息。

      使用的不是框架自动扫描,而是手动调用Validate类的validate方法校验对象。

    public static void main( String[] args ) {
            User user = new User();
            Validator validator = Validator.newInstance(user);
            validator.validate();
        }

      Hibernate的validate框架使用的是@Validate注解实现,我们也可以这样拓展,然后就是配置一个监听或者说是扫描的问题

      Validate类包含一个校验方法validate,校验传入的object,出现问题抛出异常。

        

    2、如何做出对应的validate校验?

      Annotation类至少包含几个字段,例如:

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface NotNull {
        Class<?> clazz() default NotNullValidate.class;
        String value() default Message.NOT_NULL;
    }

    Validate类的规则,ValidateSuper接口:

      

    //一个抽象类,包含抽象方法validate、init,用于编写校验逻辑和初始化操作
    public
    abstract class AbstractValidate<T> {
    //... }

      

  • 相关阅读:
    论文阅记 YOLOv4: Optimal Speed and Accuracy of Object Detection
    【项目实战】yolov3-tiny人脸数据模型训练
    面试题54. 二叉搜索树的第k大节点
    102. 二叉树的层序遍历
    107. 二叉树的层次遍历 II
    连续子数组的最大和
    172. 阶乘后的零
    26 进制
    405. 数字转换为十六进制数
    504. 七进制数
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/6437454.html
Copyright © 2011-2022 走看看