使用 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
}
}
如何在执行建议时获取 @MyAnnotation
的 value
和 exceptionList
?
我正在使用 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
}
}
我在这个论坛上看了很多问题,但没有任何效果。
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
}
}
如何在执行建议时获取 @MyAnnotation
的 value
和 exceptionList
?
我正在使用 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
}
}