SlideShare une entreprise Scribd logo
PLUGGABLE ANNOTATION
PROCESSING API
JUG TOULOUSE - 2015 - LTE CONSULTING
ARNAUD TOURNIER
ArchiDév passionné chez LTE Consulting
Speaker Devoxx, GWT.create, Paris/Toulouse JUG, etc...
@ltearno www.lteconsulting.fr
Développement - Formation - Conseil
Full stack (x86_64 to JavaScript) !
AVANT TOUT
Cette présentation est disponible sur
github.com/ltearno/annotation-processing
Des hyper-liens sont présents
JSR 269 ???
PLUGGABLE ANNOTATION
PROCESSING API...
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 !
AVANTAGES
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.
BRÈVE HISTOIRE DU
TRAITEMENT DES
ANNOTATIONS
COMMENTAIRES JAVADOC
XDoclet (2002)
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 .
PLUGGABLE ANNOTATION PROCESSING API
Depuis 2006 (Java 6) la , créé par Joe Darcy.JSR-269
Intégré à la compilation .
PRINCIPE
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.
UTILISATION
CRÉATION DE L'ANNOTATION
LE PROCESSEUR
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
UN BOUT DE CODE
Dans un autre projet on peut utiliser l'annotation et le
processeur.
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 !
SORTIE DE NOTRE EXEMPLE
FONCTIONNEMENT
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).
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.
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.
CYCLE DE VIE DU PROCESSEUR
Le compilateur instancie le processeur,
Appelle avec un ,
Appelle ,
et
,
Et appelle à chaque round.
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.
PRÉCAUTIONS !
Un processeur ne doit pas dépendre d'un autre,
Idempotent,
Commutatif.
L'INTERFACE PROCESSOR
PROCESSINGENVIRONMENT
GETSUPPORTEDANNOTATIONTYPES
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.
ROUNDENVIRONMENT
Liste des classes dans le round :
Liste des éléments annotés :
Etat du round :
ELEMENT
javax.lang.model.element.Element
Représente un package, une classe, une méthode, ...
Pour parcourir les données d'un élément, il faut soit appeler
soit utiliser un visiteur.
Ne pas utiliser instanceof !
Petit exercice : POURQUOI ?
ELEMENT
LES SORTES D'ELEMENT
annotation, class, constructeur, enum, une constante enum,
parametre d'exception, champ, initializeur d'instance, interface,
variable locale, méthode, package, paramètre, variable de
resource, initializeur statique, paramètre de type, autres (futur).
LE FILER
CRÉER UN NOUVEAU SOURCE JAVA
CRÉER UNE NOUVELLE RESSOURCE
CRÉER UN NOUVEAU FICHIER .CLASS
UTILISATION DE TEMPLATES !
Ne générer que le minimum de code !
Velocity, ...
Java Poet, ...
LE MESSAGER
LE MESSAGER DANS ECLIPSE
La même erreur dans Eclipse
LA COMPILATION JAVA
3 PHASES
Plan d'exécution de javac
Parse et Enter
Annotation Processing
Analyse et Generate
openjdk.java.net/groups/compiler/doc/compilation-overview
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
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
ATTENTION : le warning si on ne met pas
docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.h
INTÉGRATION AVEC
ECLIPSE
CONFIGURATION
Eclipse utilise son propre compilateur, JDT.
Configuration possible du projet par m2e
Pluggable annotation processing api
ATTENTION
Dans Eclipse, si le projet contenant le processeur est ouvert,
l'annotation processing est désactivé.
TESTS UNITAIRES
EXEMPLE
COMPILE-TESTING
Bibliothèque de test développée par Google, pour aider le
développement de etAuto Dagger
Test positif
et négatif
DÉMO TIME !
LIMITATIONS
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 -> !)
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
EXEMPLES DE
BIBLIOTHÈQUES
JPA meta-model generation (JSR-317),
Dagger,
Google Auto,
Immutables,
Hexa Binding,
Lombok,
GWT (RequestFactory)
LIENS EN VRAC
, , ,
, , , ,
, ,
, ,
, ,
, ,
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...
ET VOILÀ !
MERCI !
Rendez-vous sur
github.com/ltearno/annotation-processing
Twitter :
LinkedIn : fr.linkedin.com/in/lteconsulting
LTE Consulting

Contenu connexe

PDF
Java 9 modules
PDF
Interface-it
ODP
Puppet slides
PDF
Une boîte à outils pour les tests sous Java 8
PDF
"Input/Ouput, 16 ans après" à Devoxx France 2012
PDF
Java - programmation concurrente
PDF
JAVA Chapitre1
PPTX
Hibernate jpa
Java 9 modules
Interface-it
Puppet slides
Une boîte à outils pour les tests sous Java 8
"Input/Ouput, 16 ans après" à Devoxx France 2012
Java - programmation concurrente
JAVA Chapitre1
Hibernate jpa

Tendances (14)

PDF
Voxxeddays lux 2018 apres java 8, java 9 et 10
PDF
Javascript Json artchitecture
PPTX
Multithreading
PDF
I le langage java d'una manière avancée introduction
PDF
Voxxdays luxembourg 2016 retours java 8
PPTX
Les tests en PHP
PDF
Les générateurs de code, pour se simplifier la vie au quotidien
PDF
Java 8 - lambda
PPTX
Les annotations
PDF
Programmation des Threads en java
PDF
Java 8 - collections et stream
PDF
PDF
Android NDK
PDF
Java 8 - interfaces
Voxxeddays lux 2018 apres java 8, java 9 et 10
Javascript Json artchitecture
Multithreading
I le langage java d'una manière avancée introduction
Voxxdays luxembourg 2016 retours java 8
Les tests en PHP
Les générateurs de code, pour se simplifier la vie au quotidien
Java 8 - lambda
Les annotations
Programmation des Threads en java
Java 8 - collections et stream
Android NDK
Java 8 - interfaces
Publicité

Similaire à Pluggable annotation processing api (6)

PPTX
Ez18n Annotation Processing Tool in a nutshell
PDF
Annotation Processor, trésor caché de la JVM
PDF
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
PPTX
Presentation JEE et son écossystéme
PDF
Framework Spring_ In!!!!!!!troduction.pdf
Ez18n Annotation Processing Tool in a nutshell
Annotation Processor, trésor caché de la JVM
Conférence sur les annotations Java par Olivier Croisier (Zenika) au Paris JUG
Presentation JEE et son écossystéme
Framework Spring_ In!!!!!!!troduction.pdf
Publicité

Pluggable annotation processing api