原文链接: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> {
//...
}

  

最新文章

  1. 安卓Design包之超强控件CoordinatorLayout与SnackBar的简单使用
  2. linux常用命令之文件权限
  3. 实例化bean的三种方式
  4. 使用Boost asio实现异步的TCP/IP通信
  5. python: 实现sha1小工具
  6. LA 4636 (贪心) Cubist Artwok
  7. 使用windows-SQLyog连接linux-mysql
  8. node读写json文件(进阶)
  9. 用extjs6.0写一个点击新建窗口的功能
  10. 47. leetcode 437. Path Sum III
  11. 前端测试框架Jest系列教程 -- Global Functions(全局函数)
  12. 在 EFCore 定义的实体中进行 FreeSql 开发
  13. 用vector与bitset分别创建1亿以内的素数表,比较快慢
  14. jmeter如何进行MQTT性能测试(测试前期准备二,MQTT插件及协议了解)
  15. redis---安装和开启和关闭
  16. 中间件RabbitMQ之运维篇
  17. HDU1233(Kruskal&amp;Prim两解)
  18. Altium 拼板方法以及 注意的 地方
  19. IE中div被视频遮住的解决方法
  20. C/C++ -- Gui编程 -- Qt库的使用 -- 组件大杂烩

热门文章

  1. 000 初步使用Kotlin开发Android应用
  2. python中decorator的用法及原理(一)
  3. MariaDB备份和恢复
  4. I2C通信
  5. [Python] Send emails to the recepients specified in Message[&quot;CC&quot;]
  6. Selenium WebDriver 工作原理
  7. DP专题&#183;二
  8. Java并发(2):Lock
  9. Python:笔记(5)——错误、调试和测试
  10. Java程序设计专题