Quatrième cours sur la réflexion et les annotations. Fichier

Programmation par Aspect
(AOP)
Frédéric Fondement
Cours ENSISA 3AIR
2009-2010
© F. Fondement-2-
Le but du jour
En savoir plus sur les aspects
zRéflexion
zAnnotations
© F. Fondement-3-
La réflexion
Java possède son mécanisme de réflexion.
AspectJ également
zDans un advice: thisJoinPoint
Le contexte: getTarget(), getThis(), getArgs()
Lent !
Préférer systématiquement les sélecteurs de contexte
Fil d’exécution: thisJoinPointStaticPart
thisJoinPoint.getStaticPart() ==
thisJoinPointStaticPart
getKind() : method-execution, constructor-call, field-get,…
getSignature() : informations sur la nature du join point
getSourceLocation() : information sur l’endroit du join point
Fichier (.java ou .aj)
Numéro de ligne
© F. Fondement-4-
API Réflective d’AspectJ
JoinPoin
t
Ob
j
ect
Signature
name : EString
toString() : EString
JoinPointStaticPart
kind : EString
toString() : EString
SourceLocation
fileName : EString
line : EIn
t
Class
thisJoinPoin
t
thisJoinPoinStaticPart
thisEnclosingJoinPointStaticPar
t
args0..*
signature
1
staticPart
1
location 1
class 1
withinType
1
tar
g
et0..1
this0..1
Conceptuel
© F. Fondement-5-
thisJoinPointStaticPart.getKind()
org.aspectj.lang.JoinPoint
public static final java.lang.String $'9,&(B(;(&87,21 "adviceexecution"
public static final java.lang.String &216758&725B&$// "constructor-call"
public static final java.lang.String &216758&725B(;(&8
7,21
"constructor-
execution"
public static final java.lang.String (;&(37,21B+$1'/(5 "exception-handler"
public static final java.lang.String ),(/'B*(7 "field-get"
public static final java.lang.String ),(/'B6(7 "field-set"
public static final java.lang.String ,1,7,$/,=$7,21 "initialization"
public static final java.lang.String 0(7+2'B&$// "method-call"
public static final java.lang.String 0(7+2'B(;(&87,21 "method-execution"
public static final java.lang.String 35(,17,$/,=$7,21 "preinitialization"
public static final java.lang.String 67$7,&,1,7,$/,=$7,21 "staticinitialization"
© F. Fondement-6-
thisJoinPointStaticPart.getSignature()
Signature
name : EString
toString() : EString
Class
CodeSignature
MemberSignature
parameterNames : EString
AdviceSignature
MethodClass
ConstructorSignature
Constructor
InitializerSignature MethodSignature
FieldSignature
Field
CatchClauseSignature
Class
declaringClass
1
parameterTypes
0..*
exceptionTypes
0..1
methods
0..*
class 1
advice 1
constructors
0..*
class 1
constructor 1initializer
1method
1
fields 0..*
class 1
field 1
parameterType
1
returnType
0..1
© F. Fondement-7-
thisJoinPointStaticPart.getSignature()
Join Point Signature Kind
Method Call MethodSignature JoinPoint.METHOD_CALL
Method Execution MethodSignature JoinPoint.METHOD_EXECUTION
Constructor Call ConstructorSignature JoinPoint.CONSTRUCTOR_CALL
Constructor Execution ConstructorSignature JoinPoint.CONSTRUCTOR_EXECUTION
Static initializer execution InitializerSignature JoinPoint.STATICINITIALIZATION
Object pre-initialization ConstructorSignature JoinPoint.PREINTIALIZATION
Object initialization ConstructorSignature JoinPoint.INITIALIZATION
Field reference FieldSignature JoinPoint.FIELD_GET
Field assignment FieldSignature JoinPoint.FIELD_SET
Handler execution CatchClauseSignature JoinPoint.EXCEPTION_HANDLER
Advice execution AdviceSignature JoinPoint.ADVICE_EXECUTION
© F. Fondement-8-
Exercice
Dans l’aspect d’observation, notifier le nom du champ
modifié aux observateurs.
Faire une autre concrétisation de l’aspect d’observation
pour observer l’appel des méthodes move et resize.
© F. Fondement-9-
thisEnclosingJoinPointStaticPart
Informations sur le Join Point englobant
zLe join point qui a déclenché thisJoinPoint
zUtile en cas de:
Method/Constructor call
Field get/set
zOn trouve
Method/Constructor execution
thisJoinPointStaticPart dans les cas non listés ci-
dessus
© F. Fondement-10-
Les annotations
« Nouveauté » de Java 1.5
Pris en compte dans AspectJ 1.5
zInjection d’annotations en déclaration intertype
Types, attributs, méthodes, constructeurs
zDéfinition des sujets en fonction de leurs annotations
Types, attributs, méthodes, constructeurs
zLecture d’annotations
Code standard dans les advices
Sélecteurs contextuels
© F. Fondement-11-
Déclaration intertype
Injection d’annotations:
zForme:
declare @(type|method|constructor|field):
(TypePattern|MethodPattern|ConstructorPattern|
FieldPattern) :
AnnotationDeclaration;
zExemple
declare @method:
void *..Resizeable+.resize(double,double) :
@Change(kind="resize");
© F. Fondement-12-
Définition de sujet
Les patrons de définition de sujet peuvent donner les
annotations attendues sous forme de patrons
zPatron d’annotation:
(!)? @(Type|(TypePattern))
Exemples
@Ann  éléments annotés par Ann
!@Ann  éléments non annotés par Ann
@(*)  éléments annotés
@(fr.uha..*)  éléments annotés par une annotation définie
dans un sous-paquetage de fr.uha
@A @B  éléments annotés par les annotations Aet B
@(A || B)  éléments annotés soit A, soit B, soit les Aet B
@(@Inherited *)  éléments annotés par une annotation
annotée Inherited
zExemple de patron de méthode
@Change * Figure+.*(..)
© F. Fondement-13-
Sélecteurs contextuels d’annotations
zDemandent à ce qu’un élément contextuel soit annoté
Le sujet: @annotation(AnnotationDef)
L’objet this: @this(AnnotationDef)
Les arguments: @args(AnnotationDef1,
AnnotationDef2, ..)
Le récepteur: @target(AnnotationDef)
La méthode où se trouve le join point:
@withincode(AnnotationDef)
La classe où se trouve le join point:
@within(AnnotationDef)
zTouts ces sélecteurs peuvent être sujets à
reconnaissance de paramètres:
after(Change change): @annotation(change) {
String [] cparams = change.getParameters();
}
© F. Fondement-14-
Conclusion
Intérêts des aspects:
Inconvénients des aspects:
© F. Fondement-15-
Conclusion
Comment choisir ses aspects ?
zÉléments partagés entre plusieurs besoins / éléments
zModification systématiques sur l’existant
Quand on a envie de faire du copier/coller
zComme la programmation par objet: il faut de
l’expérience !
zVoir ce qu’en pensent le bouquins
1 / 4 100%

Quatrième cours sur la réflexion et les annotations. Fichier

La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !