基本思路就是开发注解,再开发一个切面,注解标注在方法上,当方法被执行的时候,进行切面的植入,具体方法如下。
1、开发注解OnceTokenCheck,该注解只能修饰方法(若注解需要修饰类或者参数,则自己修改即可)
package com.weijia.commonutils.validate.token.aop;
import java.lang.annotation.*;
@Documented
@Target({ElementType.METHOD})//注解可标注的对象(这里只能标注方法,如果要标注参数或者类请自行修改)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnceTokenCheck {
String key() default "onceToken";//注解参数,默认值也可以根据需求更改
}
2、开发切面类,切面类中的方法植入到被注解OnceTokenCheck修饰的方法上,这里主要使用环绕通知,因为环绕通知可以回调原有方法。
@Aspect
public class OnceTokenCheckAspect {
//只有被OnceTokenCheck标注的方法才执行植入aop
@Pointcut("@annotation(com.weijia.commonutils.validate.token.aop.OnceTokenCheck)")
public void pointCut(){
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint jp) throws Throwable{
//获得注解
MethodSignature signature = (MethodSignature) jp.getSignature();
OnceTokenCheck onceTokenCheck =
signature.getMethod().getAnnotation(OnceTokenCheck.class);
//注解上的属性
String key = onceTokenCheck.key();
System.out.println("注解属性key:"+onceTokenCheck.key());
//连接点方法的实参值
Object[] args = jp.getArgs();
//获取连接点方法的参数名称
String[] names = ((CodeSignature) jp.getSignature()).getParameterNames();
for (int k = 0; k < args.length; k++) {
//参数类型,返回例如java.lang.String
String type = args[k].getClass().getName();
}
//连接点方法的方法名
String methodName = jp.getSignature().getName();
System.out.println("方法名:"+methodName);
//连接点方法所在的对象
Object targetObj = jp.getTarget();
//连接点方法所在的对象的名称
String targetClassName=targetObj.getClass().getName();
Object result=null;
result=jp.proceed(args);//回调原有方法,并传入参数
return result;
}
}
3、调用示例
最后可以在控制台查看结果,调用testaop这个函数的时候将会看到一些日志信息的输出。