博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义注解
阅读量:4566 次
发布时间:2019-06-08

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

一、   目的:

自定义注解实现,POJO校验

二、元注解、标准注解

@Target 定义范围

CONSTRUCTOR

用于描述构造器(领盒饭)。

FIELD

用于描述域(领盒饭)。

LOCAL_VARIABLE

用于描述局部变量(领盒饭)。

METHOD

用于描述方法。

PACKAGE

用于描述包(领盒饭)。

PARAMETER

用于描述参数。

TYPE

用于描述类或接口(甚至 enum )。

@Retention 运行时效

取值

描述

SOURCE

在源文件中有效(即源文件保留,领盒饭)。

CLASS

 class 文件中有效(即 class 保留,领盒饭)。

RUNTIME

在运行时有效(即运行时保留)。

@Documented 在默认的情况下javadoc命令不会将我们的annotation生成再doc中去的,所以使用该标记就是告诉 jdk让它也将annotation生成到doc中去

@Inherited 子类继承注解

自动定义注解,例如

public @interface Complexity {    public enum Level {        VERY_SIMEPLE, SIMPLE, MEDIUM, COMPLEX, VERY_COMPLEX    } default @Complexity.MEDIUM}
@Target(ElementType.FIELD)  //作用域@Retention(RetentionPolicy.RUNTIME) //运行时效@Documented  @Inherited //继承注解public @interface IsEmptyAnnotation {        public boolean isEmpty() default true;        public String message() default "字段不能为空";}

三、注解处理器

处理器的代码虽然写完了,但是这还没完呢,剩下还有非常重要的步骤,那就是添加注册信息。因为注解处理器是属于javac的一个平台级的功能,所以我们的使用方式是将代码打包成jar的形式,这样就可以在其他第三方项目当中使用了。而在打包jar之前,则要在项目中添加注册信息

 

四、实现POJO的校验

User

public class User {        @IsEmptyAnnotation    public String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

@IsEmptyAnnotation 

@Target(ElementType.FIELD)  //作用域@Retention(RetentionPolicy.RUNTIME) //运行时效@Documented  @Inherited //继承注解public @interface IsEmptyAnnotation {        public boolean isEmpty() default true;        public String message() default "字段不能为空";}
AnnotationDealUtil  利用反射的机制对注解进行校验
public class AnnotationDealUtil {     private static Logger log = Logger.getAnonymousLogger();             @SuppressWarnings("unchecked")          public static Map
validate(Object bean) { Map
result = new HashMap
(); result.put("message", "验证通过"); result.put("result", true); Class
cls = bean.getClass(); // 检测field是否存在 try { // 获取实体字段集合 Field[] fields = cls.getDeclaredFields(); for (Field f : fields) { // 通过反射获取该属性对应的值 f.setAccessible(true); // 获取字段值 Object value = f.get(bean); // 获取字段上的注解集合 Annotation[] arrayAno = f.getAnnotations(); for (Annotation annotation : arrayAno) { // 获取注解类型(注解类的Class) Class
clazz = annotation.annotationType(); // 获取注解类中的方法集合 Method[] methodArray = clazz.getDeclaredMethods(); for (Method method : methodArray) { // 获取方法名 String methodName = method.getName(); // 过滤错误提示方法的调用 if(methodName.equals("message")) { continue; } // 初始化注解验证的方法处理类 (我的处理方法卸载本类中) Object obj = AnnotationDealUtil.class.newInstance(); // 获取方法 try { // 根据方法名获取该方法 Method m = obj.getClass().getDeclaredMethod(methodName, Object.class, Field.class); // 调用该方法 result = (Map
)m.invoke(obj, value, f); /* 验证结果 有一处失败则退出 */ if(result.get("result").equals(false)) { return result; } } catch (Exception e) { e.printStackTrace(); log.info("找不到该方法:"+methodName); } } } } } catch (Exception e) { e.printStackTrace(); log.info("验证出错"); } return result; } public Map
isEmpty(Object value, Field field) { Map
validateResult = new HashMap
(); IsEmptyAnnotation annotation = field.getAnnotation(IsEmptyAnnotation.class); if(value == null || value.equals("")) { validateResult.put("message", field.getName() + annotation.message()); validateResult.put("result", false); } else { validateResult.put("message", "验证通过"); validateResult.put("result", true); } return validateResult; } }

main

public static void main(String[] args) {        User advertise = new User();          advertise.setName("a");          System.out.println(AnnotationDealUtil.validate(advertise));    }

 


 

参考链接:

粗略的讲解了,AOP,注解,自定义注解,拦截器 的基本知识  

注解实现的校验,一般都是由反射实现  

转载于:https://www.cnblogs.com/litblank/p/7922278.html

你可能感兴趣的文章
java8使用stream的collect进行list转map注意事项
查看>>
部分和问题
查看>>
进程,线程
查看>>
[。。。]不知道是事故还是故事的东西
查看>>
AtCoder Beginner Contest 073
查看>>
链表的回文结构
查看>>
slqmap简单使用
查看>>
如何禁用或重新启用计算机的休眠功能
查看>>
window函数 resetAccumulator
查看>>
AKKA好文
查看>>
hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
查看>>
python环境下xgboost的安装与使用
查看>>
C#的数据类型转换
查看>>
VC++视频会议系统源码 文档齐全
查看>>
非CI执行Allure2 trends空白问题
查看>>
【剑指offer】面试题 64. 求 1+2+3+...+n
查看>>
【Sorting】UVa400 Unix ls
查看>>
51Nod 1120 - 机器人走方格 V3(Lucas定理+Catalan数)
查看>>
pytest五:fixture_autouse=True
查看>>
bsearch函数二分法
查看>>