GLO-3001
Partie II
Introduction à AspectJ
Félix-Antoine Bourbonnais
Hiver 2010
Terminologie Le langage AspectJ Annexes
1 Terminologie
2 Le langage AspectJ
L’aspect
AspectJ
• Un module indépendant
• Très similaire à une classe dans AspectJ
• Représente une préoccupation
• Permet de regrouper dans une même entité une préoccupation
transverse
Note : Ceci est une vision technique telle qu’utilisée avec AspectJ.
Note : Peut varier en fonction du langage et du tisseur.
L’aspect
Contenu (AspectJ)
Point de jonction
• Join point (en)
• Parfois appelé point de jointure
• Point précis dans le programme
• Emplacements possibles et valides pour injecter du code
• Généralement, des emplacements dans le flot de contrôle
Point de jonction
Exemples
• L’appel d’une méthode
• L’accès (get/set) à un attribut
• Lorsqu’une exception est lancée
• Etc.
Point de coupure
• Pointcut (en)
• Sous-ensemble des points de jonction
• Identifie les points de jonction (join point) où du code (advices)
sera injecté
• En d’autres mots, où injecter/greffer le code
• Détermine où l’aspect doit s’exécuter en fonction de certaines
conditions parmi tous les points de jonction
Point de coupure
Exemple en AspectJ
Tous les appels à une méthode dont le nom débute par « do » situés dans
une méthode de la classe « TheClass » :
1 pointcut callToDoMethodsInTheClass() :
2 call(∗ do∗(..)) &&
3 within(TheClass);
Exemple en AspectJ
Saluer avant les emplacements désignés par le point de coupure
« saluerPointcut »
1 before() : saluerPointcut() {
2 System.out.prinln("Bonjour le monde!");
3 }
Les injections
• Inter-type Declarations (en)
• Permettent « d’altérer » une classe sans la modifier
• Exemples :
Exemple en AspectJ
Injection de la méthode « acceptVisitor(Visitor v) » à la classe « TheClass »
1 public aspect TheAspect {
2
3 public void TheClass.acceptVisitor(Visitor v){
4 v.visit(object);
5 }
1 Terminologie
2 Le langage AspectJ
Aspects
Points de coupure
Greffons
Les aspects
• Syntaxe très similaire à une classe Java
• Dans un .java ou un .aj
• Syntaxe @AspectJ dans les .java
Ordre de préséance
Conflits !
Plusieurs aspects peuvent être « branchés » sur les mêmes points
de jonction. L’ordre d’exécution est alors indéterminé !
On peut utiliser la ligne « declare precedence » pour y remédier
dans le cas de précédences claires...
1 Terminologie
2 Le langage AspectJ
Aspects
Points de coupure
Greffons
• call(expression-méthode) :
Au moment des appels des méthodes qui correspondent à
l’expression.
ex. : call( int foo() )
• execution(expr-méthode) :
Au moment de l’exécution des méthodes correspondantes.
• get(expr-attribut) :
À la lecture des attributs correspondants.
• set(expr-attribut) :
À l’assignation des attributs correspondants.
Attention ! list.add(2) : list n’est pas assignée
• adviceexecuton() (combiné) :
Dans l’exécution d’un « advice ».
• if(expr-bool) (combiné)
• within(type) (combiné) :
... et à l’intérieur de la classe du type donné.
• this(type OU id) (combiné) :
... et l’objet en cours d’éxécution est du type donné.
• target(type OU id) (combiné) :
... et l’objet ciblé est du type donné.
• args(type OU id) (combiné) :
Un argument du type.
• cflow(pointcut) :
À partir de ce point dans le flot de contrôle du programme.
• Etc.
( call(int bar()) ||
call(int foo())
) && within(MyClass)
• être inversées (négatif) avec « ! »
Définition
primitive( [visibilite] [final] type-retour
[pkg.][cls.]methode([params|.., ...])
[throws exception] )
Exemples :
• Signature exacte :
• call(Foo.new())
• call(Foo+.new())
• call( (Foo+ && !Foo).new())
• call(*Test+.new(..))
• within(ca.ulaval.glo22879.*)
• within(MaClasse)
http ://www.eclipse.org/aspectj/doc/released/quick5.pdf
« this » VS « target »
Les primitives « this » et « target » s’interprètent en fonction des
autres primitives auxquelles elles sont combinées.
Exemple
Appels vers une méthode « foo » qui se font à partir de la classe « Bar »
Exemple
Appels vers une méthode « foo » de la classe « Bar »
Exemple
execution( int foo() ) && target(Bar)
⇐⇒
execution( int Bar.foo() )
⇐⇒
execution( int foo() ) && this(Bar)
Boucles infinies
Bouclage !
AspectJ recherche les points de jointure dans la classe mais
également dans les aspects. Il est donc dangereux de boucler si un
aspect s’applique sur lui-même !
Boucles infinies
Exemple 1
Exemple 2
1 Terminologie
2 Le langage AspectJ
Aspects
Points de coupure
Greffons
Type de greffons
• before()
• after()
• after() returning
after() returning(Type x)
• after() throwing
after() throwing(Type x)
• around
Exemple
Journaliser le début et la fin de l’exécution de toutes les méthodes qui prennent un « Integer »
comme unique paramètre.
1 pointcut log() :
2 execution(∗ ∗(Integer)) && !adviceexecution();
3
4 before() : log() {
5 System.out.println("DEBUT de " + thisJoinPoint.getSignature());
6 }
7
8 after() : log() {
9 System.out.println("FIN de " + thisJoinPoint.getSignature());
10 }
• proceed([arguments]) :
• Dans un around()
• Permet de poursuivre l’exécution
• Les arguments sont ceux du greffon pas de la méthode
interceptée !
Félix-Antoine Bourbonnais Architecture logicielle GLO-3001 Hiver 2010 34 / 41
Terminologie Le langage AspectJ Annexes
Exemple
Exemple
1 pointcut pc() :
2 call(int foo(..));
3
4 after() returning(int i) : pc() {
5 }
Variations
1 pointcut log() :
2 execution(∗ ∗(..)) && !adviceexecution();
3
4 before() : log() {
5 System.out.println("DEBUT de " + thisJoinPoint.getThis().toString());
6 }
7
8 after() : log() {
9 System.out.println("FIN de " + thisJoinPoint.getThis().toString());
10 }
1 pointcut log() :
2 execution(∗ ∗(..)) && !adviceexecution();
3
4 Object around() : log() {
5 System.out.println("DEBUT de " + thisJoinPoint.getThis().toString());
6 Object ret = proceed()
7 System.out.println("FIN de " + thisJoinPoint.getThis().toString());
8 return ret;
9 }
Variations (suite)
Variations (suite)
Où est l’erreur ? ?
1 pointcut log(Object source, Object obj) :
2 call(∗ ∗(..)) && !adviceexecution() &&
3 this(source) && target(obj);
4
5 before(Object source, Object obj) : log(source, obj) {
6 System.out.println(String.format("DEBUT de %s à " +
7 "partir de %s", obj, source));
8 }
Variations (suite)
Version corrigée...
1 pointcut log(Object source, Object obj) :
2 call(∗ ∗(..)) &&
3 this(source) && target(obj) &&
4 !cflow(adviceexecution());
5
6 before(Object source, Object obj) : log(source, obj) {
7 System.out.println(String.format("DEBUT de %s à " +
8 "partir de %s", obj, source));
9 }
cflow ? ?
Suite au prochaine cours...
Félix-Antoine Bourbonnais Architecture logicielle GLO-3001 Hiver 2010 40 / 41
Terminologie Le langage AspectJ Annexes
Références
[1] AspectJ 5 quick reference.
http://www.eclipse.org/aspectj/doc/released/quick5.pdf.