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