自己造个简单数据校验的注解@Value和@Mail
发布日期:2021-06-29 15:52:04
浏览次数:2
分类:技术文章
本文共 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 (vmax){ 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的
反射机制
来实现
转载地址:https://console.blog.csdn.net/article/details/108947846 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月03日 23时43分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
winform制作的精美时钟
2019-04-30
WinForm监控键盘鼠标
2019-04-30
小程序开发学习—2019年新个税计算器
2019-04-30
小程序页面排版样式例子
2019-04-30
IOC容器Unity 使用
2019-04-30
js给onclick赋值,传参数
2019-04-30
.net日历控件 Calendar选择多个日期
2019-04-30
RecyclerView Item 行高定义无效的BUG
2019-04-30
markdown发生HTML渲染组件出错的解决方案
2019-04-30
android ScrollView嵌套WebView高度为0的BUG
2019-04-30
android 混淆代码后 app 运行报错时, 如何精准定位报错位置
2019-04-30
android 定位并通过百度在线查询详细地址教程
2019-04-30
android TextView 首行缩进与部分文字改变颜色大小效果
2019-04-30
android app 优化启动体验, 不闪白屏并且快速展示 splash
2019-04-30
INSTALL_FAILED_NO_MATCHING_ABIS 解决方案
2019-04-30
android 把打好的 apk 包通过 adb 的方式安装到手机上
2019-04-30
区块链学习之路[持续更新]
2019-04-30
RecycleView-Java.lang.IllegalArgumentException: Called attach on a child which is not detached
2019-04-30
AI学习笔记 (一) 手写识别
2019-04-30