190 likes | 270 Views
AspectJ Syntax Basics. Identify Join Points. 1 public class Bit { 2 bool value; 3 void Set() { 4 value = true; 5 } 6 void Clear() { 7 value = false; 8 }. 9 void Toggle { 10 if(Get()) Set(); 11 else clear(); 12 } 13 void Get() {
E N D
Identify Join Points 1 public class Bit { 2 bool value; 3 void Set() { 4 value = true; 5 } 6 void Clear() { 7 value = false; 8 } 9 void Toggle { 10 if(Get()) Set(); 11 else clear(); 12 } 13 void Get() { 14 return value; 15 } 16 }
Pointcuts • Named pointcut AllCall(): call( * *(..)); • Anonymous before(): call( * *(..)) { … }
Named Pointcut Syntax [access specifier] pointcut pointcut- name([args]): pointcut definition
Why Named Pointcuts? • Pointcut Reuse • Separation of two specifications: • Where additional behavior is to be applied? • What is the additional behavior? • Late Binding of Design Decisions
Pointcut Reuse & Separation public pointcut StringArg(String s): execution( * *(..)) && args(s); around(String s): StringArg(s) { /* Omit execution if null argument */ } around(String s): StringArg(s) { /* Omit execution if not valid XML */ }
Late Binding abstract aspect Lock { pointcut CriticalSections(); before(): CriticalSections() { /* Acquire lock */ } after(): CriticalSections() { /* Release lock */ } }
Late Binding … aspect BufferLock extends Lock { pointcut CriticalSections(): call(* * Buffer.Write(..)); }
Poincut composition • pointcut1 && pointcut2 • pointcut1 || pointcut2 • ! pointcut
Signatures • Type Signatures • Method Signatures • Field Signatures
Example Type Signature javax..*Model+ Any sub-type of a given type Any number of characters including period Any number of characters excluding the period
Exercise 1 • Write down the type signature to pick out only the sub-types of all the types in the javax package or its direct and indirect subpackages that have a name ending in Model.
Example Method Signature * javax..*.add*Listener(EventListener+)
Example Field Signature !public static * banking..*.*
Cflow and Cflowbelow • Cflow (Pointcut) - Captures all join points in the control flow of the join points matched by the specified pointcut, including the join points themselves. • Cflowbelow(Pointcut) – Excludes the matching join points, matches everything below.
cflow( execution Account.debit(..)) 1 void debit(int amount) { 2 if( this.getBalance() > amount) { 3 this.setBalance( this.getBalance() – amount); 4 } 5 int getBalance() { 6 return db.Query(name, “balance”); 7 } 8 int setBalance(int balance) { 9 db.Update(name, “balance”, balance); 10 }
Lexical Pointcuts • within( type pattern ) • withincode( method or constructor pattern)
Identify matches within(Bit) 1 public class Bit { 2 bool value; 3 void Set() { 4 value = true; 5 } 6 void Clear() { 7 value = false; 8 } 9 void Toggle { 10 if(Get()) Set(); 11 else clear(); 12 } 13 void Get() { 14 return value; 15 } 16 }
withincode(* * Bit.*et(..)) 1 public class Bit { 2 bool value; 3 void Set() { 4 value = true; 5 } 6 void Clear() { 7 value = false; 8 } 9 void Toggle { 10 if(Get()) Set(); 11 else clear(); 12 } 13 bool Get() { 14 return value; 15 } 16 }