如何通过aspect获取自定义注解的参数?

How to get parameter of custom annotation by aspect?

在我的方面方法中,我需要获取名称的值(自定义注释的参数)name = "unit test"

用户调用方法:

@Service
@RequiredArgsConstructor
@Slf4j
public class Task {

    @CronLogger(name = "unit test")
    public void testCronLogger(String param) {
        log.info("testCronLogger ...");
    }

}

自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CronLogger {
   public String name() default "";
}

看点方法:

@Aspect
@Component
@EnableAspectJAutoProxy
public class CronLoggerAspect {
    
    private static final Logger log = LoggerFactory.getLogger(CronLoggerAspect.class);
    
    @Around("@annotation(CronLogger)")
    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] tab = joinPoint.getArgs();
        for (Object object : tab) {
            log.debug("CronLogger: {}", object);
        }
       return joinPoint.proceed();
    }
}

控制台:

CronLogger: test
testCronLogger ...

需要获取Method并获取该方法的Annotation。

@Around("@annotation(CronLogger)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
    String name = MethodSignature.class.cast(joinPoint.getSignature()).getMethod().getAnnotation(CronLogger.class)
            .name();
    log.debug("CronLogger: {}", name);
    return joinPoint.proceed();
}

这个怎么样(未经测试,我只是修改了你的代码)?

@Around("@annotation(cronLogger)")
public Object trace(ProceedingJoinPoint joinPoint, CronLogger cronLogger) throws Throwable {
  log.debug("CronLogger: {}", cronLogger.name());
  return joinPoint.proceed();
}

请注意大小写字符。一个是注解class名称,另一个是方法参数名称。