Как получить значение аннотации метода из ProceedingJoinPoint?

у меня есть ниже аннотация.

MyAnnotation.java

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

}

SomeAspect.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 " С in @MyAnnotation. Теперь, как я могу получить доступ к "ABC" стоимостью в переходите метод SomeAspect.java класса?

спасибо!

3 ответов


вы можете узнать подпись С 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 Class тоже AnnotatedElement, так что вы можете получить его так же, как от Method. Например. Аннотацию класса объявления метода можно получить с помощью

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

Это также работает - вы можете получить информацию об аннотациях, используя отражение в классе.

Annotation anno = MyClass.class.getAnnotation(MyAnnotation.class);

или

Annotation anno = MyClass.class.getDeclaredMethod("somethod").getAnnotation(MyAnnotation.class);

это работает только если ваша аннотация доступна во время выполнения, которое вы заявили правильно.

@Retention(RetentionPolicy.RUNTIME)

на самом деле я думаю, что могу получить value по-другому, а не просто из ProceedingJoinPoint, что определенно потребует от нас использования reflection.

попробуйте следующее, используя аннотацию напрямую: добавить com.mycompany.MyAnnotation yourAnnotation в своем advice 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 в советах params просто работают так, как в

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

yourAnnotation может быть допустимым именем переменной с MyAnnotation в params уже указывает какой аннотации это должно быть. Вот!--9--> используется только для извлечения экземпляра аннотации.

если вы хотите передать больше параметров вы можете попробовать args().

для более подробной информации, пожалуйста, проверьте его официального doc. Для значения аннотации вы можете просто найти @Auditable.