如何从 ProceedingJoinPoint 获取方法的注释值?

2022-08-31 10:13:00

我有下面的注释。

我的注释.java

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

}

有些可视性.java

public class SomeAspect{

 @Around("execution(public * *(..)) && @annotation(com.mycompany.MyAnnotation)")
    public Object procede(ProceedingJoinPoint call) throws Throwable {

  //Some logic

}

}

其他一些.java

public class SomeOther{

@MyAnnotation("ABC") 
public String someMethod(String name){


}


}

在上面的课堂上,我通过“ABC”与@MyAnnotation。现在,我如何在SomeAspect.java类的procede方法中访问“ABC”值?

谢谢!


答案 1

您可以从 ProceedingJoinPoint 获取签名,如果发生方法调用,只需将其强制转换为 MethodSignature 即可。

@Around("execution(public * *(..)) && @annotation(com.mycompany.MyAnnotation)")
public Object procede(ProceedingJoinPoint call) throws Throwable {
    MethodSignature signature = (MethodSignature) call.getSignature();
    Method method = signature.getMethod();

    MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
}

但您应该首先添加一个注释属性。您的示例代码没有,例如

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

    String value();
}

然后,您可以访问它

MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String value = myAnnotation.value();

编辑

如果我在课堂上有@MyAnnotation(“ABC”)如何获得价值?

A 也是带注释的元素,因此您可以像从 .例如,可以使用以下命令获得方法的声明类的注释ClassMethod

 Method method = ...;
 Class<?> declaringClass = method.getDeclaringClass();
 MyAnnotation myAnnotation = declaringClass.getAnnotation(MyAnnotation.class)

由于您使用的是 spring,您可能还想使用 spring 的 AnnotationUtils.findAnnotation(..)。它像弹簧一样搜索注释。例如,还要查看超类和接口方法等。

 MyAnnotation foundAnnotation = AnnotationUtils.findAnnotation(method, MyAnnotation.class);

编辑

您可能还会对 5.2 中引入的 Spring 的 MergedAnnotations 的功能有所了解。


答案 2

实际上,我认为我们可以以另一种方式获得,而不仅仅是从RegationJoinPoint,这肯定需要我们利用.valuereflection

直接使用注释进行如下尝试:在 中添加您的和。com.mycompany.MyAnnotation yourAnnotationadvice params@annotation(yourAnnotation)@Around

@Around("execution(public * *(..)) && @annotation(yourAnnotation)")
public Object procede(ProceedingJoinPoint pjp, com.mycompany.MyAnnotation yourAnnotation) {
    ...
    yourAnnotation.value(); // get your annotation value directly;
    ...
}

com.mycompany.MyAnnotation在建议参数中就像在

@Around("execution(public * *(..)) && @annotation(com.mycompany.MyAnnotation)")

yourAnnotation可以是有效的变量名,因为在参数中已经指出它应该是哪个注释。此处仅用于检索注释实例。MyAnnotationyourAnnotation

如果你想传递更多的参数,你可以试试。args()

有关更多详细信息,请查看其官方文档。对于“注释”值,您只需搜索 。@Auditable


推荐