使用 AspectJ 获取注解参数

Get Annotation Parameter with AspectJ

我在这个论坛上看了很多问题,但没有任何效果。

public @interface MyAnnotation {
    String value() default "";
    Class[] exceptionList;
}

@MyAnnotation(value="hello", exceptionList={TimeOutException.class})
public void method() {}


@Aspect
public class MyAspect {
    @Around("@annotation(MyAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation) {
        System.out.println(myAnnotation.exceptionList); // should print out TimeOutException
    }
}

如何在执行建议时获取 @MyAnnotationvalueexceptionList? 我正在使用 Spring 4.0.6,AspectJ 1.7.4

你已经差不多了。应该是吧。

您正在使用正确的方法来检索注释,因此您拥有可用的值。

你的问题 - 如果我解释非常 极简主义的问题描述(!) 你只是通过代码片段中的注释正确地提供 (!) - 是(错误的)假设将 Class 类型的数组粘贴到 System.out.println() 中将打印出它包含的 Classes 的名称。 它没有。而是打印有关引用的信息:

[Ljava.lang.Class;@15db9742

如果您想要 Classes 的名称,您将必须遍历该数组的元素并使用 .getName()、.getSimpleName() 或其他名称提供方法之一Class.

有关如何打印数组元素的更多信息,请参见此处:

What's the simplest way to print a Java array?

当然,如果问题是您从注释字段中获取空值,那么整个答案可能完全离题。但是由于您没有提供足够的问题描述("nothing works" 不是问题描述!),我们只能猜测您的问题是什么。

此问题的解决方案是确保通知方法的参数名称与 AspectJ 表达式中的参数名称相匹配。就我而言,建议方法应如下所示:

@Aspect
public class MyAspect {
    @Around("@annotation(myAnnotation)")
    public Object handle(ProceedingJoinPoint joinPoint, MyAnnotation myAnnotation) {
        System.out.println(myAnnotation.exceptionList); // should print out TimeOutException
    }
}