2011-08-19 11 views
5

Estoy buscando un punto de corte que coincida con las ejecuciones de métodos en clases que subclasan una clase con una anotación específica. La excelente AspectJ cheat sheet me ayudó a crear el siguiente punto de corte:@AspectJ pointcut para subclases de una clase con una anotación

within(@my.own.annotations.AnnotationToMatch *) && execution(* *(..)) 

Esto coincide con todas las llamadas a métodos de una clase A que lleva el @AnnotationToMatch, pero no de un método de la clase B que se extiende A. ¿Cómo se puede hacer coincidir las dos cosas?

Respuesta

3
public aspect AnnotatedParentPointcutAspect { 

//introducing empty marker interface 
declare parents : (@MyAnnotation *) implements TrackedParentMarker; 

public pointcut p1() : execution(* TrackedParentMarker+.*(..)); 

before(): p1(){ 
    System.out.println("Crosscutted method: " 
      +thisJoinPointStaticPart.getSignature().getDeclaringTypeName() 
      +"." 
      +thisJoinPointStaticPart.getSignature().getName()); 
} 
} 
+1

Gracias! Para el beneficio de otros: si usa el estilo de anotación, declarar que los padres se traducen a @DeclareParents ("(@ MyAnnotation *)") private TrackedParentMarker emptyMixinForClassesWithMyAnnotation; –

+0

Eso funciona bien para superclases, pero no tan bien para las interfaces. Es decir. en código como 'MiInterfaz o = new MyClass()' se ve loke 'MyClass' se carga antes de la interfaz y la condición no coincide. Agregar un 'println (MyInterface.class)' antes de la instrucción soluciona el problema, pero no es un requisito factible para los aspectos de la biblioteca. ¿Algunas ideas? – ddimitrov

3

Otra posibilidad más simple y es declarar la anotación como @Inherited - por lo que se aplica a las subclases también.

+0

Pero no funcionará si no puede declarar la anotación como @ Heredado. P.ej. clases base de bibliotecas de terceros. – alehro

+0

La anotación dice my.own.annotation. – RCInd

Cuestiones relacionadas