java自定义形参注解(使用aop捕捉)
提示:这里简述项目相关背景:
项目场景:在项目开发过程中,我们会使用大量注解,但是业务需求不同,对注解的需求就不同,需要我们自己自定义注解的场景有很多,在这里就教大家怎么实现自己的注解并解析
1、写注解
自定义注解主要就是包括有两部分,一个就是创建注解,另一个就是解析注解,先说创建注解,创建注解比较简单
注解的实质就是一个接口,只是所有注解都需要继承Annotation这个类,所以一样是通过创建class是同一个步骤
输入注解名之后,选择Annotation就创建了一个注解
然后注解里面可以自定义参数,可写可不写,根据个人需要
@Target这个注解就标识着你这个注解的使用地方,ElementType.PARAMETER就表示这个注解可以用在参数上(一个注解可以有多个用途)
注解已经创建完成
2、注解解析:
注解想要解析,就要先进行使用,我们先写一个test方法(两个形参,一个加注解,一个不加注解),如下图:
然后就到解析步骤,解析的话我这里使用aop进行辅助解析,因为像这种形参注解,是有可能在任意一个方法的参数上使用的,所以要使用aop进行横向切入的方法,对每一个方法进行拦截处理,代码如下:
@Aspect
@Component
public class NotNullAop {
//这里controller在idea中会报红,因为在pc-common模块中没有controller这个包
//但是把pc-common这个模块导入其他模块之后,因为其他模块中有controller,所以是可以正常运行的,
//无须理会这个报红
@Pointcut("execution(public * com.lb.precisioncoach.controller.*.*(..)))")
public void validate(){}
@Before("validate()")
public void doBefore(JoinPoint joinPoint){
//获取方法上的形参
Object[] params = joinPoint.getArgs();
if(params.length == 0){
return;
}
//获取方法,此处可将signature强转为MethodSignature
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
//参数注解,1维是参数,2维是注解
Annotation[][] annotations = method.getParameterAnnotations();
for (int i = 0; i < annotations.length; i++) {
Object param = params[i];
Annotation[] paramAnn = annotations[i];
//参数为空,直接下一个参数
if(param == null || paramAnn.length == 0){
continue;
}
for (Annotation annotation : paramAnn) {
//这里判断当前注解是否为Test.class
if(annotation.annotationType().equals(NotNull.class)){
System.out.println("是这个注解");
//校验该参数,验证一次退出该注解
//TODO 校验参数
break;
}
}
}
}
}
我们可以在比较了注解类型之后,对符合条件的注解进行校验。
完毕