Как получить значение аннотации метода из 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
.