Concepts plus avancés. Fichier - UHA

publicité
Programmation par Aspect
(AOP)
Frédéric Fondement
Cours ENSISA 3AIR
2009-2010
Le but du jour
En savoir plus sur les aspects
z Réflexion
z Annotations
-2-
© F. Fondement
La réflexion
Java possède son mécanisme de réflexion.
AspectJ également
z Dans 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
-3-
© F. Fondement
API Réflective d’AspectJ
Class
1
SourceLocation
fileName : EString
line : EInt
withinType
class
1
Conceptuel
Object
location
JoinPoint
1
staticPart
0..* args
1
JoinPointStaticPart
kind : EString
toString() : EString
thisJoinPoinStaticPart
1
0..1 target
0..1 this
thisJoinPoint
signature
Signature
name : EString
toString() : EString
-4-
thisEnclosingJoinPointStaticPart
© F. Fondement
thisJoinPointStaticPart.getKind()
org.aspectj.lang.JoinPoint
public static final java.lang.String ADVICE_EXECUTION
public static final java.lang.String CONSTRUCTOR_CALL
CONSTRUCTOR_EXECU
public static final java.lang.String
TION
public static final java.lang.String EXCEPTION_HANDLER
public static final java.lang.String FIELD_GET
public static final java.lang.String FIELD_SET
public static final java.lang.String INITIALIZATION
public static final java.lang.String METHOD_CALL
public static final java.lang.String METHOD_EXECUTION
public static final java.lang.String PREINTIALIZATION
public static final java.lang.String STATICINITIALIZATION
-5-
"adviceexecution"
"constructor-call"
"constructorexecution"
"exception-handler"
"field-get"
"field-set"
"initialization"
"method-call"
"method-execution"
"preinitialization"
"staticinitialization"
© F. Fondement
thisJoinPointStaticPart.getSignature()
Class
1
Signature
name : EString
toString() : EString
declaringClass
class 1
0..* parameterTypes
0..1 exceptionTypes
fields 0..*
Field
MemberSignature
parameterNames : EString
Class
1
parameterType
0..1
returnType
CatchClauseSignature
field 1
FieldSignature
CodeSignature
ConstructorSignature
constructor 1
1
Constructor
AdviceSignature
InitializerSignature
initializer
constructors
advice 1
Class
class
1
class 1
0..*
-6-
MethodSignature
1 method
Method
methods
0..*
© F. Fondement
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
Advice execution
CatchClauseSignature JoinPoint.EXCEPTION_HANDLER
AdviceSignature
-7-
JoinPoint.ADVICE_EXECUTION
© F. Fondement
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.
-8-
© F. Fondement
thisEnclosingJoinPointStaticPart
Informations sur le Join Point englobant
z Le join point qui a déclenché thisJoinPoint
z Utile en cas de:
• Method/Constructor call
• Field get/set
z On trouve
• Method/Constructor execution
• thisJoinPointStaticPart dans les cas non listés cidessus
-9-
© F. Fondement
Les annotations
« Nouveauté » de Java 1.5
Pris en compte dans AspectJ 1.5
z Injection d’annotations en déclaration intertype
• Types, attributs, méthodes, constructeurs
z Définition des sujets en fonction de leurs annotations
• Types, attributs, méthodes, constructeurs
z Lecture d’annotations
• Code standard dans les advices
• Sélecteurs contextuels
- 10 -
© F. Fondement
Déclaration intertype
Injection d’annotations:
z Forme:
• declare @(type|method|constructor|field):
(TypePattern|MethodPattern|ConstructorPattern|
FieldPattern) :
AnnotationDeclaration;
z Exemple
• declare @method:
void *..Resizeable+.resize(double, double) :
@Change(kind="resize");
- 11 -
© F. Fondement
Définition de sujet
Les patrons de définition de sujet peuvent donner les
annotations attendues sous forme de patrons
z Patron 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 A et B
• @(A || B) → éléments annotés soit A, soit B, soit les A et B
• @(@Inherited *) → éléments annotés par une annotation
annotée Inherited
z Exemple de patron de méthode
• @Change * Figure+.*(..)
- 12 -
© F. Fondement
Sélecteurs contextuels d’annotations
z Demandent à 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)
z Touts ces sélecteurs peuvent être sujets à
reconnaissance de paramètres:
• after(Change change): @annotation(change) {
String [] cparams = change.getParameters();
…
}
- 13 -
© F. Fondement
Conclusion
Intérêts des aspects:
Inconvénients des aspects:
- 14 -
© F. Fondement
Conclusion
Comment choisir ses aspects ?
z Éléments partagés entre plusieurs besoins / éléments
z Modification systématiques sur l’existant
• Quand on a envie de faire du copier/coller
z Comme la programmation par objet: il faut de
l’expérience !
z Voir ce qu’en pensent le bouquins
- 15 -
© F. Fondement
Téléchargement