博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己造个简单数据校验的注解@Value和@Mail
阅读量:1887 次
发布时间:2019-04-26

本文共 3302 字,大约阅读时间需要 11 分钟。

本篇文章介绍了如何自己实现一个进行数据校验的注解,使用@Value注解检查数据是否在最大值和最小值之间,使用@Mail注解检查数据是否是一个合法的电子邮件地址

文章目录

预备知识

元注解

元注解 作用 取值 示例
@Target 表明注解可以生效的位置 java.lang.annotation.ElementType枚举值 @Target(ElementType.FIELD)
@Retention 注解在什么时期生效 java.lang.annotation.RetentionPolicy枚举值 @Retention(RetentionPolicy.RUNTIME)
@Documented 注解可以被javadoc识别 @Documented

反射

使用反射机制可以获取一个类的所有信息,例如

  • 获取所有属性
Field[] fields = objectClass.getDeclaredFields();
  • 查看一个属性是否被某个注解标记
boolean b = field.isAnnotationPresent(Value.class)
  • 获取注解
Value value = field.getAnnotation(Value.class);
  • 获取对象的属性值
Integer v = (Integer) field.get(object);

注解源码

@Value()

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Value {
public int min() default 0; public int max() default 100;}

@Mail

@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Mail {
}

测试Bean

Person.java

public class Person {
private String name; @Value(min = 0,max = 50) private int age; @Mail private String mail; @Override public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + ", mail='" + mail + '\'' + '}'; } public Person(String name, int age, String mail) {
this.name = name; this.age = age; this.mail = mail; } // ----getter&setter---- //省略 getter个setter方法}

数据校验工具类

在这个类中,使用反射获取待校验对象的所有属性,遍历属性,判断属性是否被相应注解标记,再获取相关注解和属性值,进一步实现具体数据校验功能。

ValidateUtil.java

public class ValidateUtil {
//传入需要校验属性的对象 public static void checkFields(Object object) throws IllegalAccessException {
Class
objectClass = object.getClass(); Field[] fields = objectClass.getDeclaredFields(); for (Field field : fields) {
//检查属性是否添加了@Value注解 if (field.isAnnotationPresent(Value.class)){
//设置私有属性可获取 field.setAccessible(true); Integer v = (Integer) field.get(object); //获取注解设置的值 Value value = field.getAnnotation(Value.class); int min = value.min(); int max = value.max(); //检查对象的值是否在范围内 if (v
max){
System.err.println("属性值不在范围内 min="+min+",max="+max+",实际值:"+v); throw new RuntimeException("属性值不在范围内"); } } //检查属性是否添加了@Mail注解 if (field.isAnnotationPresent(Mail.class)){
field.setAccessible(true); String mail=(String)field.get(object); //简单判断邮件地址是否合法 int i = mail.indexOf("@"); if (i<=0 || i==mail.length()-1){
System.err.println("邮件:"+mail+" 不是合法的邮件格式"); throw new RuntimeException("非法邮件地址"); } } } }}

测试

public class MainApp {
public static void main(String[] args) {
Person person=new Person("张三",51,"zhangsan@qq.com"); try {
ValidateUtil.checkFields(person); System.out.println(person); } catch (IllegalAccessException e) {
e.printStackTrace(); } }}

总结

  • 注解只是一个标记,具体的业务功能还需要其他类来实现
  • 实现注解具体功能的时候,一般需要使用java的反射机制来实现

转载地址:http://iezdf.baihongyu.com/

你可能感兴趣的文章
七牛云图片外链失效的解决办法
查看>>
[Vue warn]: Invalid prop: type check failed for prop “src“. Expected String, Object, got Module
查看>>
Laravel 8 整合 Vue 2 解决 history 路由模式 404 问题
查看>>
Laravel8 + Vue2 + Vuetify2 开发的前后端分离的单页面博客类 Web 应用
查看>>
MongoDB 小试牛刀--创建数据库和用户
查看>>
C++单链表的文件存取
查看>>
Ubuntu 20.04 卸载 xubuntu 安装 gnome 桌面
查看>>
打造 Win10 + Kali + Ubuntu + WinPE + LiveCD + U盘存储多合一超级移动硬盘
查看>>
2021年如何学习Flutter?
查看>>
MongoDB安装教程
查看>>
使用IDEA开发Android程序(一)安装Android开发环境
查看>>
使用IDEA开发Android程序(二)第一个简单的程序并运行
查看>>
Android启动过程及各个镜像间的关系
查看>>
嵌入式工程师
查看>>
嵌入式系统学习入门
查看>>
嵌入式系统学习入门-UBOOT
查看>>
移植wifi无线网卡到mini2440上全过程
查看>>
NFS使用方法详解
查看>>
LINUX下的设备驱动程序
查看>>
_IO, _IOR, _IOW, _IOWR 宏的用法与解析
查看>>