SlideShare a Scribd company logo
1 of 67
Download to read offline
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
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

More Related Content

What's hot

Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Jean-Michel Doudoux
 
Javascript Json artchitecture
Javascript  Json artchitecture Javascript  Json artchitecture
Javascript Json artchitecture zaghir
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introductionsabrine_hamdi
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Jean-Michel Doudoux
 
Les générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienLes générateurs de code, pour se simplifier la vie au quotidien
Les générateurs de code, pour se simplifier la vie au quotidienNicolas Carlo
 
Programmation des Threads en java
Programmation des Threads en javaProgrammation des Threads en java
Programmation des Threads en javaEzéquiel Tsagué
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et streamFranck SIMON
 
Java 8 - interfaces
Java 8 - interfacesJava 8 - interfaces
Java 8 - interfacesFranck SIMON
 

What's hot (14)

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

Similar to Pluggable annotation processing api

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Jérôme Tamborini
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache MavenArnaud Héritier
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders BattleArnaud Héritier
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !Paris Salesforce Developer Group
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsAntoine Rey
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellgdigugli
 
20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation MavenArnaud Héritier
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Jean-Michel Doudoux
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJsimeon
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation MavenArnaud Héritier
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tousMicrosoft
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchTarek Halloul
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)hibnico
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 

Similar to Pluggable annotation processing api (20)

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Apache ANT
Apache ANTApache ANT
Apache ANT
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache Maven
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
 
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
La Tooling API, est-ce pour moi ? Bien sûr, viens voir pourquoi !
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Ces outils qui vous font gagner du temps
Ces outils qui vous font gagner du tempsCes outils qui vous font gagner du temps
Ces outils qui vous font gagner du temps
 
Ez18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshellEz18n Annotation Processing Tool in a nutshell
Ez18n Annotation Processing Tool in a nutshell
 
20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven20081023 - Paris Vi Master STL TA - Initiation Maven
20081023 - Paris Vi Master STL TA - Initiation Maven
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 
Aspect avec AspectJ
Aspect avec AspectJAspect avec AspectJ
Aspect avec AspectJ
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous.NET Microframework, les joies de l'électronique et du code pour tous
.NET Microframework, les joies de l'électronique et du code pour tous
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuch
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
R Devtools
R DevtoolsR Devtools
R Devtools
 

Pluggable annotation processing api