java - programacion - ¿Cómo obtener el valor de anotación de un método de ProceedingJoinPoint?
aspectj (3)
De hecho, creo que puede obtener el value
de otra forma en lugar de proceder solo de ProceedingJoinPoint , que definitivamente requerirá que hagamos uso de la reflection
.
Haga una prueba de la siguiente manera usando la anotación directamente: agregue com.mycompany.MyAnnotation yourAnnotation
en sus advice params
y @annotation(yourAnnotation)
en @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
en params de consejos solo funcionan así en
@Around("execution(public * *(..)) && @annotation(com.mycompany.MyAnnotation)")
yourAnnotation
puede ser un nombre de variable válido ya que MyAnnotation
en params ya indica qué anotación debería ser. Aquí yourAnnotation
se usa para recuperar la instancia de anotación solamente.
Si quieres pasar más parámetros, puedes probar args()
.
Para más detalles, verifique su doc oficial. Para el valor de Anotación, puede simplemente buscar @Auditable
.
Tengo una anotación debajo.
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
}
}
SomeOther.java
public class SomeOther{
@MyAnnotation("ABC")
public String someMethod(String name){
}
}
En la clase superior estoy pasando " ABC " con en @MyAnnotation . Ahora, ¿cómo puedo acceder al valor " ABC " en el método de la clase SomeAspect.java ?
¡Gracias!
Esto también funciona: puede obtener información de anotación mediante la reflexión sobre la clase.
Annotation anno = MyClass.class.getAnnotation(MyAnnotation.class);
O
Annotation anno = MyClass.class.getDeclaredMethod("somethod").getAnnotation(MyAnnotation.class);
Esto funciona solo si su anotación está disponible en tiempo de ejecución, que ha declarado correctamente.
@Retention(RetentionPolicy.RUNTIME)
Puede obtener la Signature de ProceedingJoinPoint y, en el caso de una invocación de método, simplemente MethodSignature a 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);
}
Pero primero debes agregar un atributo de anotación. Su código de ejemplo no tiene uno, por ejemplo
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
Entonces puedes acceder a ella
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String value = myAnnotation.value();
EDITAR
¿Cómo obtener valor si tengo @MyAnnotation ("ABC") en el nivel de clase?
Una Class
también es un elemento AnnotatedElement
, por lo que puede obtenerlo de la misma manera que desde un Method
. Por ejemplo, se puede obtener una anotación de la clase de declaración del método usando
Method method = ...;
Class<?> declaringClass = method.getDeclaringClass();
MyAnnotation myAnnotation = declaringClass.getAnnotation(MyAnnotation.class)