Search code examples
constructorannotationsaspectjpointcut

How to define an aspectj pointcut that picks out all constructors of a class that has a specific annotation?


Here is the annotation:

@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnnotation {
    String name();
}

Here is one annotated class:

@MyAnnotation(name="foo")
public class ClassA {
    public ClassA() {
        // Do something
    }
}

Here is a second annotated class:

@MyAnnotation(name="bar")
public class ClassB {
    public ClassB(String aString) {
        // Do something
    }
}

I am looking for an aspectj pointcut that correctly matches the constructors for ClassA and ClassB while not matching any other constructor for any other class NOT annotated by MyAnnotation.


Solution

  • Your pointcut should look like this:

    execution((@MyAnnotation *).new(..))
    

    If the annotation is in another package:

    execution((@de.scrum_master.aop.demo.MyAnnotation *).new(..))
    

    Or if you do not want to fully qualify the package:

    execution((@*..MyAnnotation *).new(..))
    

    Edit: Okay, some more info about your question in the comment:

    Constructor executions have no return value which you could capture in

    after() returning(Object myObject) : myJoinpoint()
    

    This only works for methods. So please use

    after(Object myObject) returning : myJoinpoint() && this(myObject)
    

    instead if you do need the constructed object for any purpose.