programming programacion oriented orientada example ejemplo aspectos anotaciones java spring spring-aop spring-3 java-ee-7

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)