Recipe 7.1. Capturing a Call to a ConstructorProblemYou want to capture when a call to a constructor that matches a specific signature is invoked. SolutionUse the call(Signature) pointcut with the additional new keyword as part of the signature. The syntax for using the call(Signature) pointcut in relation to constructors is: pointcut <pointcut name>(<any values to be picked up>) : call(<optional modifier> <class>.new(<parameter types>)); DiscussionThe call(Signature) pointcut has three key characteristics when used to capture calls to constructors:
Example 7-1 shows how to use the call(Signature) pointcut to capture calls to the constructor on the MyClass class that takes an int and String as parameters. Example 7-1. Using the call(Signature) pointcut to capture join points when a constructor is calledpublic aspect CallNewRecipe { /* Specifies calling advice when any constructor is called that meets the following signature rules: Class Name: MyClass Method Name: new (This is a keyword indicating the constructor call) Method Parameters: int, String */ pointcut myClassConstructorWithIntAndStringPointcut( ) : call(MyClass.new (int, String)); // Advice declaration before( ) : myClassConstructorWithIntAndStringPointcut( ) { System.out.println( "-------------- Aspect Advice Logic ---------------"); System.out.println( "In the advice picked by " + "myClassConstructorWithIntAndOthersPointcut( )"); System.out.println( "The current type of object under construction is: "); System.out.println(thisJoinPoint.getThis( )); System.out.println( "Signature: " + thisJoinPoint.getSignature( )); System.out.println( "Source Line: " + thisJoinPoint.getSourceLocation( )); System.out.println( "--------------------------------------------------"); } } Figure 7-1 shows how the call(Signature) pointcut is applied. Figure 7-1. How the call(Signature) pointcut is applied to constructorsSee AlsoThe execution(Signature) and call(Signature) pointcuts in Recipes Recipe 4.1 and Recipe 4.4 respectively deal with attaching advice to methods other than constructors; Recipe 4.1 shows some of the wildcard variations that can be used in a Signature; Chapter 13 deals with the environments available to the advice when picked by the different pointcuts; Recipe 20.2 describes in more detail the use of the around( ) advice, specifically in dealing with overriding constructors to return a different type of object. |