aop实现对方法参数的获取

2022-12-03 13:00:02 浏览数 (1)

场景: 需要对入参的数据进行校验,添加相关逻辑或日志监控等

实现方式: AOP自定义注解 反射

代码:

MyParam

代码语言:javascript复制
/**
 * 描述:注解
 *
 * @author Administrator
 * @since 2022/7/11
 */
@Target(value = {ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyParam {

    String value() default "";
}

MyParamAsp

代码语言:javascript复制
/**
 * desc: 具体逻辑 <br>
 * date: 2022/7/11
 *
 * @author Administrator
 */
@Slf4j
@Aspect
@Component
public class MyParamAsp {

    @Pointcut("@annotation(com.zyjournals.web.miniprogram.config.anno.MyParam)")
    public void controllerAspect() {
    }

    @Before("controllerAspect()")
    public void doBefore() {
        log.info("===========================>AOP Before");
    }

    /**
     * desc: aop after <br>
     * date: 2022/7/11
     *
     * @author Administrator
     */
    @After("controllerAspect()")
    public void doAfter(JoinPoint joinPoint) throws NoSuchMethodException {
        log.info("===========================>AOP After");
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        // 请求的方法参数值
        Object[] args = joinPoint.getArgs();
        // 请求的方法参数名称
        LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
        String[] paramNames = u.getParameterNames(method);
        if (args != null &amp;&amp; paramNames != null) {
            String params = "";
            for (int i = 0; i < args.length; i  ) {
                params  = "  "   paramNames[i]   ": "   args[i];
                System.out.println("params = "   params);
            }
        }

    }
}

使用:

代码语言:javascript复制
@MyParam("flag")
public void testAop(String flag , String tag) {
    log.info("===========================>测试方法执行了");
}

0 人点赞