编写自己的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> {
//... }

  

原文地址:https://www.cnblogs.com/aigeileshei/p/6437454.html