[Java 5 - Annotations] Compilateur d'annotations
Bonjour,
Aprés avoir lu le tutorial sur les annotations Java 5, j'ai réalisé le code équivalent de celui proposé (avec APT), mais en utilisant un processeur d'annotations différents: Spoon. Je trouve le code plus simple, et il permet des traitements d'annotations beaucoup plus puissant, notamment grace à un système de template.
Voilà l'équivalent du code que vous trouverez là:
http://adiguba.developpez.com/tutori...nnotations/#L3
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public class TodoProcessor extends
AbstractAnnotationProcessor<TODO, CtNamedElement> {
public void process(TODO arg0, CtNamedElement arg1) {
switch (arg0.level()) {
case MINEUR:
getFactory().getEnvironment().reportMessage(
arg0.value(),
(arg1 instanceof CtSimpleType) ? (CtSimpleType) arg1 : arg1
.getParent(CtSimpleType.class), arg1,
arg1.getPosition());
break;
case NORMAL:
getFactory().getEnvironment().reportWarning(
arg0.value(),
(arg1 instanceof CtSimpleType) ? (CtSimpleType) arg1 : arg1
.getParent(CtSimpleType.class), arg1,
arg1.getPosition());
break;
case IMPORTANT:
getFactory().getEnvironment().reportError(
arg0.value(),
(arg1 instanceof CtSimpleType) ? (CtSimpleType) arg1 : arg1
.getParent(CtSimpleType.class), arg1,
arg1.getPosition());
break;
}
}
} |
En processant un fichier d'examples annoté (chemin relatif:src/examples/Test.java) avec notre processeur, on obtient:
Code:
1 2 3 4 5 6
|
$> java spoon.Launcher -v -i src/examples/Test.java -p examples.todo.TodoProcessor
Warning: Utiliser une annotation a la place d'une String at examples.Test.day(Test.java:13)
Error: Ecrire le code de la methode at examples.Test.method(Test.java:16)
1 warning 1 error
Done |
J'ai poussé un peu l'examples du constructeur vide http://adiguba.developpez.com/tutori...otations/#L3.5. Cette version ajoute un constructeur vide lorsqu'il n'existe pas. Voici le processeur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public class EmptyConstructorProcessor extends
AbstractAnnotationProcessor<EmptyConstructor, CtClass<?>> {
public void process(EmptyConstructor arg0, CtClass<?> arg1) {
// Si on ne trouve pas de constructeur vide
if (arg1.getConstructor(new CtTypeReference<?>[0]) == null) {
// On affiche un warning
getFactory().getEnvironment().reportWarning(
"Un constructeur vide est requis", arg1, arg1,
arg1.getPosition());
// On ajoute le constructeur vide
Substitution.insertAll(arg1, new EmptyConstructorTemplate());
}
}
} |
Et le template qui permet "facilement" de creer le constructeur vide :
Code:
1 2 3 4 5 6
|
public class EmptyConstructorTemplate implements Template {
public EmptyConstructorTemplate() {
super();
}
} |
Vous pourrez trouver un jar contenant ces examples là :
http://www.lifl.fr/~petitpre/spoon/d...annotation.jar
Et un tutorial un peu plus complet (en anglais) là:
http://spoon.gforge.inria.fr/tutorial/