自己造个简单数据校验的注解@Value和@Mail

    科技2024-01-06  90

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

    文章目录

    预备知识元注解反射 注解源码测试Bean数据校验工具类测试总结

    预备知识

    元注解

    元注解作用取值示例@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) @Documented public @interface Value { public int min() default 0; public int max() default 100; }

    @Mail

    @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @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<min||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的反射机制来实现
    Processed: 0.021, SQL: 8