IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Utiliser AspectJ pour générer des accesseurs
Un billet de blog de janselmeer

Le , par janselmeer

0PARTAGES

Pour ceux qui ne connaissent pas l'ITD d'AspectJ (Déclaration Inter-Types), cela permet de rajouter des éléments dans les classes via un aspect : attributs; méthodes, annotations, héritage d'interface...
Est-ce que je peux m'en servir pour générer des accesseurs dans une bean ?
Pour le savoir, je crée un bean avec un attribut property :

public class SampleBean {

public String property;

}


Maintenant, je crée un aspect dans lequel je déclare les accesseurs de l'attribut property.
La syntaxe est simple : il suffit de préfixer le nom des méthode par le type cible (ici SampleBean) :


privileged aspect SampleBean_propertyITD {

public String SampleBean.getProperty() {
System.out.println("SampleBean.getProperty() généré par ITD");
return this.property;
}

public void SampleBean.setProperty(String value) {
System.out.println("SampleBean.setProperty(value) généré par ITD");
this.property = value;
}

}


Maintenant j'aimerais pouvoir invoquer mes accesseurs automatiquement lorsque j'utilise l'attribut.
Je crée donc des advices qui peuvent tirer parti de mes méthodes générées par ITD.
Cette fois-ci la syntaxe est un peu plus compliquée mais reste compréhensible :


java.lang.String around(SampleBean instance) : get(java.lang.String SampleBean.property) && target(instance) && ! withincode(java.lang.String SampleBean.getProperty()) {
return instance.getProperty();
}

void around(SampleBean instance, java.lang.String value) : set(java.lang.String SampleBean.property) && args(value) && target(instance) && ! withincode(void SampleBean.setProperty(*)){
instance.setProperty(value);
}


Il ne reste plus qu'à utiliser mon SampleBean :

SampleBean bean = new SampleBean();
bean.property = "value";
value = bean.property;


L'exécution de ce code affiche les lignes suivantes dans la console :


SampleBean.setProperty(value) généré par ITD
SampleBean.getProperty() généré par ITD


Tout ça, c'est bien mais comment je fais pour générer les accesseurs pour plusieurs beans ? C'est là que l'on atteint la limite d'AspectJ : il faut créer un aspect pour chaque propriété :aie:

Mais heureusement, il y a une solution : générer les aspects. Pour cela je montrerai dans un prochain billet comment utiliser un AnnotationProcessor.

Vous avez lu gratuitement 1 429 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !