6. La JSR 269 - Pluggable Annotation Processing API permet
d'exploiter les annotations présentes dans le code en
s'insérant dans le processus de compilation, et de générer de
nouvelles sources.
Traitement des annotations à la compilation,
Génération de code,
Génération de fichiers de configuration,
Documentation, Cartographie,
Vérifications, Build breakers,
etc...
On ne modifie pas les sources existants !
8. Le code généré est visible.
Pas de traitement au runtime donc pas d'impact sur les
performances.
Pas d'instrumentation du byte-code, donc plus simple.
11. APT
, retiré officiellement avec Java 7
car .
Annotation Processing Tool
non extensible à Java > 5
Outil lancé en dehors de la compilation.
L'API Mirror utilise les packages .
14. On fournit un processeur d'annotation,
Le compilateur gère des de processing,
A chaque round, les nouveaux sources sont traités (phases
Parse et Enter),
Les processeurs sont choisis et reçoivent l'AST des classes
traitées,
Les processeurs peuvent générer de nouveaux fichiers
(sources, classes et resources) qui seront parsés et traités au
suivant.
18. LE FICHIER SPI
Pour packager et activer un processeur, le plus simple est
d'utiliser SPI :
Le fichier
contient la liste des processeurs :
Packager le tout dans un jar
19. UN BOUT DE CODE
Dans un autre projet on peut utiliser l'annotation et le
processeur.
20. PACKAGING ET COMPILATION
Le processeur et le fichier SPI sont dans un jar.
Ce jar est dans le class path au moment de la compilation de
.
C'est tout !
23. A chaque round, le processeur doit traiter les classes
générées au round précédent.
S'il est appelé au premier round, il le sera pour les autres,
jusqu'au dernier round (même si aucune annotation n'est
présente pour lui).
24. DÉCOUVERTE DES PROCESSEURS
Les proceseurs sont découverts par le compilateur.
fournit des options pour contrôler l'ensemble
des processeurs disponibles :
une liste prédéfinie,
un chemin de recherche,
utiliser SPI.
25. CHOIX DU PROCESSEUR
Appel des processeurs en fonction :
des annotations présentes dans les classes traitées,
les annotations supportées par les processeurs,
le fait qu'un processeur ait claimé une annotation.
26. CYCLE DE VIE DU PROCESSEUR
Le compilateur instancie le processeur,
Appelle avec un ,
Appelle ,
et
,
Et appelle à chaque round.
27. A CHAQUE ROUND
calcule l'ensemble des annotations sur les classes en
cours,
si au moins une annotation est présente, au fur et à mesure
que les processeurs les claime, elles sont retirées des
annotations non matchées.
quand l'ensemble est vide ou qu'il n'y a plus de processeur
candidat, le round est fini.
si aucune annotation n'est présente, seuls les processeurs
universels ("*") sont appelés, et reçoivent un ensemble vide
de classes à traiter.
32. LA MÉTHODE PROCESS
On reçoit l'ensemble des annotations à traiter,
On retourne pour claimer les annotations et
empêcher les autres processeurs de les traiter.
45. 3 PHASES
Plan d'exécution de javac
Parse et Enter
Annotation Processing
Analyse et Generate
openjdk.java.net/groups/compiler/doc/compilation-overview
46. JAVAC
Action Paramètres
Génération
des sources
-s répertoire
Désigner un
processeur
-processor
fr.lteconsulting.MyAnnotationProcessor,autre...
Spécifier un
chemin de
recherche
-processorPath le_chemin
Passer des
options
-Acle=valeur
47. JAVAC (SUITE)
Action Paramètres
Désactiver l'AP -proc:none
Seulement l'AP -proc:only
Chemin de recherche des
sources
-sourcePath
Désactiver la génération des
implicite
-implicit:none
Répertoire de sortie des -d
Affichage debug -XprintRounds -
XprintProcessorInfo
48. ATTENTION : le warning si on ne met pas
docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.h
60. Pas d'accès à l'AST complet (corps des méthodes)
Pas possible de modifier des classes existantes
Certains bug ne permettent pas de traiter correctement les
génériques
Java et les IDE ne surveillent que les éléments annotés
pour redéclencher le processing (parfois problématique
lorsque l'on a des dépendances complexes -> !)
61. HACKING AU DELÀ
: de bons hacks pour accéder à l'implémentation
(javac de sun et jdt) et modifier l'AST
Immutables : quelques workarounds captant les
implementations JDK / JDT pour gérer les génériques
Explications techniques générales dans
Lombok
The Hacker's guide
to JavaC
65. , , ,
, , , ,
, ,
, ,
, ,
, ,
Hibernate Validation JM Doudoux Lombok How Lombok
works ? Lombok encore... Hacking JavaC HexaBinding
Coders Breakfast Prez d'Angelika Langer Dr. Macphail's
trance Créez et utilisz vos annotations Histoire des
annotation processing 4 vidéos sur Parleys Utilisation de la
JSR-269 chez Les Furets Save method parameter names Au
JUG Paris par Olivier Croisier...