You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Spring AOP获取带有自定义注解的方法参数值?

如何在Spring AOP的@Around通知中获取带@TestParam注解的参数值

这问题我熟,咱们一步步来搞定它!要拿到带自定义参数注解的参数值,核心是把方法签名和实际参数对应起来,具体步骤如下:

步骤分解

  1. 转换签名类型:首先得把ProceedingJoinPoint的Signature转换成MethodSignature——只有它能提供方法的元数据(比如参数注解、方法对象)。
  2. 获取方法与参数:通过MethodSignature拿到目标方法的Method对象,同时获取实际传入的参数数组。
  3. 匹配注解与参数:遍历方法参数的注解数组,找到标记了@TestParam的参数索引,再从实际参数数组中取出对应的值。

完整代码示例

@Around("execution(* com.yourpackage.Test.test(..))") // 替换成你的切入点表达式
public Object intercept(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    // 先判断是不是方法调用,非方法调用直接放行
    if (!(proceedingJoinPoint.getSignature() instanceof MethodSignature)) {
        return proceedingJoinPoint.proceed();
    }

    MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
    Method targetMethod = methodSignature.getMethod();
    // 获取实际传入的参数列表
    Object[] args = proceedingJoinPoint.getArgs();
    // 获取每个参数上的所有注解(二维数组:外层是参数索引,内层是该参数的注解集合)
    Annotation[][] paramAnnotations = targetMethod.getParameterAnnotations();

    // 遍历寻找带@TestParam的参数
    for (int paramIndex = 0; paramIndex < paramAnnotations.length; paramIndex++) {
        Annotation[] annotations = paramAnnotations[paramIndex];
        for (Annotation annotation : annotations) {
            if (annotation instanceof TestParam) {
                // 找到目标参数,args[paramIndex]就是它的值
                Object annotatedParamValue = args[paramIndex];
                // 这里可以做你需要的逻辑,比如日志、校验、修改参数值等等
                System.out.println("带@TestParam注解的参数值:" + annotatedParamValue);
            }
        }
    }

    // 必须放行方法调用,否则原方法不会执行
    return proceedingJoinPoint.proceed();
}

额外注意事项

  • 切入点表达式要准确:确保你的@Around注解里的切入点能匹配到目标方法Test.test(),比如上面的execution(* com.yourpackage.Test.test(..)),替换成你实际的包路径和方法名。
  • 处理多个注解参数:如果方法有多个参数标记了@TestParam,上面的循环会逐个找到并处理它们。
  • 重载方法的特殊情况:如果目标方法是重载的,methodSignature.getMethod()拿到的是接口方法(如果存在接口的话),如果需要获取实现类的方法,可以用proceedingJoinPoint.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes())来获取。

内容的提问来源于stack exchange,提问作者PurpleCraw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:23:46