5

I'm looking for a pointcut that matches method executions in classes that subclass a class with a specific annotation. The excellent AspectJ cheat sheet helped me to create the following pointcut:

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

This matches all method calls of a class A that carries the @AnnotationToMatch, but not method of a class B that extends A. How can I match both?

2 Answers 2

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()); } } 
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks! For the benefit of others: if you use the annotation style, the declare parents translates to @DeclareParents("(@MyAnnotation *)") private TrackedParentMarker emptyMixinForClassesWithMyAnnotation;
That works well for super-classes, but not so well for interfaces. I.e. in code such as MyInterface o = new MyClass() it looks loke MyClass gets loaded before the interface and the condition doesn't match. Adding a println(MyInterface.class) before the statement fixes the problem, but is not feasible requirement for library aspects. Any ideas?
3

Another and simpler possibility is to declare the annotation as @Inherited - thus it applies to the subclasses as well.

1 Comment

But it won't work if you cannot declare annotation as @Inherited. E.g. base classes from third party libraries.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.