SlideShare une entreprise Scribd logo
APT in a nutshell

    @gdigugli
    @dbaeli
Speakers
@dbaeli                            @gdigugli
• Chien de berger Agile pour       • Développeur java depuis 1999
                                   • Architecte pour

• Développeur de plus de 30 ans
• Usine logicielles & DevOps       • ILOG - IBM
• Qualité Logicielle                librairie graphique 2D
                                    moteur de règles
                                   • Prima-Solutions
                                    plate-forme de services pour J2EE
                                    code génération de modèle métier



2
APT : qu’est-ce que c’est?
• Annotation Processing Tool
• Souvenez vous la commande CPP et les #define
• Les processeurs s’intercalent entre la lecture des
  fichiers sources et le générateur de bytecode
• Approche de plugins basée sur
  java.util.ServiceLoader (META-INF/services)
• Pas de framework de templating pour générer
  des fichiers code source java
Appeler APT depuis la ligne de
          commande javac
javac
 -cp $CLASSPATH
 -proc:only             -proc:none

 -encoding UTF-8              fqcn des
                              implémentations
 -processor $PROCESSOR
 -d $PROJECT_HOMEtargetclasses
 -s $PROJECT_HOMEtargetgenerated-
 sourcesapt
 -sourcepath $SOURCE_PATH        optionnel
 -verbose
 $FILES
Appeler APT depuis maven
• Le plugin maven-compiler avec des options passées « à la main »
• Le plugin org.bsc.maven:maven-processor-plugin (google code)
L’API javax.annotation.processing
Interface Processor et classe AbstractProcessor
Exemple de processor
 @SupportedAnnotationTypes pour déclarer l’annotation cible




 Créer un FileObject pour écrire du contenu
Meta modèle d’un fichier source java




Quelques sous type d’Element que l’on caste en
fonction de Element.getKind()
Méta modèle d’un fichier source
Comparaison avec java.lang.reflect
Java.lang.reflect              Javax.annotation.processing
java.lang.Class                TypeElement
Constructor                    ExecutableElement
Field, Parameter               VariableElement
Method                         ExecutableElement
java.lang.Package              PackageElement


•   NO Class.newInstance()
•   NO instanceOf, NO isAssignable()
•   NO getConstructor, getMethod, …
•   Impossible de tester l’arbre d’héritage lorsqu’on
    navigue dans le source d’une classe
Ca sert à quoi ?
• Injecter des patterns répétitifs et complexes
• Générer des factories, des singletons
• Générer des délégations avec du code de management
   –   Assertions
   –   Sonde JMX
   –   Transaction
   –   Gestion des data sources
• Générer des rapports sur du code
   – Tables de références
   – Requêtes SQL embarquées dans le code java
Pattern avec injection – je fais un
               framework
• Annoter des beans ou des interfaces
    Générer les implémentations ou les proxy
    Injecter les implémentations
    Générer les descripteurs pour le framework
     d’injection ou utiliser un classpath scanneur
 Le code client ne doit pas avoir de références sur
  le code généré
 Possibilité de mixer le code généré avec des
  annotation interprétées à runtime
   Utiliser les conventions de nommage des classes
    cibles et la réflection
Analyse et transformation de code vers
           des fichiers plats
• Générer des fichiers pour le tableurs
   Cartographie des @Deprecated dans une base de
    code volumineuse
   Données métiers pour de la documentation : les
    constantes de toutes les énumérations d’un
    modèle métier
• Générer des fichiers properties
   Configuration de l’application pour le staging
    (développement/recette/production)
DSL avec des annotations
• Ajouter des annotations qui paramètrent un
  pattern complexe
  Par exemple: le pattern pour des MBeans en
   ajoutant des méthodes de moyenne ou de dérivée
   en fonction du temps sur les sondes primitives
• Le code client référence directement le code
  généré
  Le code généré ne peut pas être utilisé dans le
   même module
  requière une modularisation soigneuse
No limit …
• Tentation de générer trop de patterns
• Un plugin APT est difficile à maintenir
• Les tests unitaires sont complexes à écrire
• Chronophage à debugger
• Parfois plus de complexité dans un processeur
  APT que de maintenir un pattern à la main
• Peu de références ou de support
• Outillage inexistant pour le templating du code à
  générer
    Penser à utiliser freemarker ou velocity
Compilation : une ou deux passes ?
• Une passe
   Le plugin APT s’exécute dans la même exécution que
    la compilation des sources java ‘statiques’
   Le code source apparait directement sous forme de
    bytecode (.class)
   Difficile à debugger en cas de soucis
 Deux passes
   On exécute javac en mode proc:only
   Puis une deuxième fois en mode proc:none avec les
    sources générées dans le sourcepath
   Le debug devient possible sur le code généré
Templating
• A votre guise !
• Respecter l’indentation classique java si vous travaillez en
  ‘deux passes’
• Un petit moteur de template tient dans une classe
    Moteur de macro de apache ant
APT dans mon IDE
• La plupart des IDE sont configurés avec javac en
  mode proc:none
   Les IDE sont souvent configurable pour activer le
    mode de compilation ‘une passe’
   Aucun support pour le mode ‘deux passes’

• En mode ‘deux passes’ :
  penser à configurer le
  répertoire de sources
  générées dans les projets
  de l’IDE

Contenu connexe

Tendances

Introduction à Java
Introduction à JavaIntroduction à Java
Introduction à Java
Ahmed EL ATARI
 
Les nouveautés de Visual Studio 11
Les nouveautés de Visual Studio 11Les nouveautés de Visual Studio 11
Les nouveautés de Visual Studio 11
Microsoft
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
Arnaud Héritier
 
[2015] Laravel yet another framework
[2015] Laravel  yet another framework[2015] Laravel  yet another framework
[2015] Laravel yet another framework
LAHAXE Arnaud
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
Ippon
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs ruby
pinguin666
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en Java
Florian Beaufumé
 
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
Antoine Rey
 
Introduction TypeScript
Introduction TypeScriptIntroduction TypeScript
Introduction TypeScript
felixbillon
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et Reactor
Florian Beaufumé
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
Mouna Torjmen
 
Flex4.5 air3.0
Flex4.5 air3.0Flex4.5 air3.0
Flex4.5 air3.0
Mathurin Body
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
julien pauli
 
Play Framework
Play FrameworkPlay Framework
Play Framework
Armaklan
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Mourad DACHRAOUI
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
julien pauli
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
Mathias Kluba
 
Codons notre infrastructure
Codons notre infrastructureCodons notre infrastructure
Codons notre infrastructure
Oswald De Riemaecker ☁
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Julien Jakubowski
 

Tendances (20)

Introduction à Java
Introduction à JavaIntroduction à Java
Introduction à Java
 
Les nouveautés de Visual Studio 11
Les nouveautés de Visual Studio 11Les nouveautés de Visual Studio 11
Les nouveautés de Visual Studio 11
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
 
[2015] Laravel yet another framework
[2015] Laravel  yet another framework[2015] Laravel  yet another framework
[2015] Laravel yet another framework
 
Présentation symfony drupal
Présentation symfony drupalPrésentation symfony drupal
Présentation symfony drupal
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
Run java vs ruby
Run java vs rubyRun java vs ruby
Run java vs ruby
 
Programmation concurrente en Java
Programmation concurrente en JavaProgrammation concurrente en Java
Programmation concurrente en Java
 
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
 
Introduction TypeScript
Introduction TypeScriptIntroduction TypeScript
Introduction TypeScript
 
Programmation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et ReactorProgrammation réactive avec Spring 5 et Reactor
Programmation réactive avec Spring 5 et Reactor
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 
Flex4.5 air3.0
Flex4.5 air3.0Flex4.5 air3.0
Flex4.5 air3.0
 
AlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHPAlterWay SolutionsLinux Outils Industrialisation PHP
AlterWay SolutionsLinux Outils Industrialisation PHP
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
 
Patterns and OOP in PHP
Patterns and OOP in PHPPatterns and OOP in PHP
Patterns and OOP in PHP
 
ALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - SpecflowALT.Net Juin 2012 - Specflow
ALT.Net Juin 2012 - Specflow
 
Codons notre infrastructure
Codons notre infrastructureCodons notre infrastructure
Codons notre infrastructure
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 

En vedette

Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
gdigugli
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcing
gdigugli
 
Be Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
Be Next - Alumni des projets de l'ASBL Les Jeunes EntreprisesBe Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
Be Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
Alexandre Prost
 
La joconde serait un homme
La joconde serait un hommeLa joconde serait un homme
La joconde serait un homme
annasanseoi
 
Dell kd476 battery
Dell kd476 batteryDell kd476 battery
Dell kd476 battery
chemyok
 
Ez18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exempleEz18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exemple
gdigugli
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une application
gdigugli
 

En vedette (9)

Ez18n theorie encoding gouvernance
Ez18n theorie encoding gouvernanceEz18n theorie encoding gouvernance
Ez18n theorie encoding gouvernance
 
Ez18n crowdsourcing
Ez18n crowdsourcingEz18n crowdsourcing
Ez18n crowdsourcing
 
Be Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
Be Next - Alumni des projets de l'ASBL Les Jeunes EntreprisesBe Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
Be Next - Alumni des projets de l'ASBL Les Jeunes Entreprises
 
Dossier aisles
Dossier aislesDossier aisles
Dossier aisles
 
La joconde serait un homme
La joconde serait un hommeLa joconde serait un homme
La joconde serait un homme
 
Dell kd476 battery
Dell kd476 batteryDell kd476 battery
Dell kd476 battery
 
Mi nombre es
Mi nombre esMi nombre es
Mi nombre es
 
Ez18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exempleEz18n hands on - Annotation Processing Tool par l'exemple
Ez18n hands on - Annotation Processing Tool par l'exemple
 
DevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une applicationDevOps illustré : la jungle de la configuration d'une application
DevOps illustré : la jungle de la configuration d'une application
 

Similaire à Ez18n Annotation Processing Tool in a nutshell

Usine Logicielle 2013
Usine Logicielle 2013Usine Logicielle 2013
Usine Logicielle 2013
Stéphane Liétard
 
Codons notre infrastructure
Codons notre infrastructureCodons notre infrastructure
Codons notre infrastructure
continuousphp
 
Présentation1
Présentation1Présentation1
Présentation1
Boulkenafet samir
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
Ombotimbe Salifou
 
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
 
Industrialisez vos projets Php
Industrialisez vos projets Php Industrialisez vos projets Php
Industrialisez vos projets Php
ALTER WAY
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
ekino
 
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Microsoft
 
Universitélang scala tools
Universitélang scala toolsUniversitélang scala tools
Universitélang scala tools
Fabrice Sznajderman
 
C#
C#C#
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
Julien Dubois
 
Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)
Vincent Biret
 
Octo Maven.pdf
Octo Maven.pdfOcto Maven.pdf
Octo Maven.pdf
badrfathallah2
 
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
sabrine_hamdi
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
Christophe HERAL
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPF
Boubker ABERWAG
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
Christophe Furmaniak
 
JAVA Chapitre2
JAVA Chapitre2JAVA Chapitre2
JAVA Chapitre2
Mohamed Ferchichi
 
Liferay france symposium 2012 - montée de version d’une instance liferay
Liferay france symposium 2012 - montée de version d’une instance liferayLiferay france symposium 2012 - montée de version d’une instance liferay
Liferay france symposium 2012 - montée de version d’une instance liferay
Sébastien Le Marchand
 

Similaire à Ez18n Annotation Processing Tool in a nutshell (20)

Usine Logicielle 2013
Usine Logicielle 2013Usine Logicielle 2013
Usine Logicielle 2013
 
Codons notre infrastructure
Codons notre infrastructureCodons notre infrastructure
Codons notre infrastructure
 
Présentation1
Présentation1Présentation1
Présentation1
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
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)
 
_JCVFr
_JCVFr_JCVFr
_JCVFr
 
Industrialisez vos projets Php
Industrialisez vos projets Php Industrialisez vos projets Php
Industrialisez vos projets Php
 
Industrialisation PHP - Canal+
Industrialisation PHP - Canal+Industrialisation PHP - Canal+
Industrialisation PHP - Canal+
 
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
Du hard et des réseaux: Les outils pour construire l'internet des objets chez...
 
Universitélang scala tools
Universitélang scala toolsUniversitélang scala tools
Universitélang scala tools
 
C#
C#C#
C#
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)Vincent biret azure functions et flow (montreal)
Vincent biret azure functions et flow (montreal)
 
Octo Maven.pdf
Octo Maven.pdfOcto Maven.pdf
Octo Maven.pdf
 
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
 
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
[Scrum Day 2011] Outillage Agile dans un environnement Microsoft
 
Formation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPFFormation d'architecte logiciel AFCEPF
Formation d'architecte logiciel AFCEPF
 
Rex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantesRex docker en production meeutp-docker-nantes
Rex docker en production meeutp-docker-nantes
 
JAVA Chapitre2
JAVA Chapitre2JAVA Chapitre2
JAVA Chapitre2
 
Liferay france symposium 2012 - montée de version d’une instance liferay
Liferay france symposium 2012 - montée de version d’une instance liferayLiferay france symposium 2012 - montée de version d’une instance liferay
Liferay france symposium 2012 - montée de version d’une instance liferay
 

Ez18n Annotation Processing Tool in a nutshell

  • 1. APT in a nutshell @gdigugli @dbaeli
  • 2. Speakers @dbaeli @gdigugli • Chien de berger Agile pour • Développeur java depuis 1999 • Architecte pour • Développeur de plus de 30 ans • Usine logicielles & DevOps • ILOG - IBM • Qualité Logicielle  librairie graphique 2D  moteur de règles • Prima-Solutions  plate-forme de services pour J2EE  code génération de modèle métier 2
  • 3. APT : qu’est-ce que c’est? • Annotation Processing Tool • Souvenez vous la commande CPP et les #define • Les processeurs s’intercalent entre la lecture des fichiers sources et le générateur de bytecode • Approche de plugins basée sur java.util.ServiceLoader (META-INF/services) • Pas de framework de templating pour générer des fichiers code source java
  • 4. Appeler APT depuis la ligne de commande javac javac -cp $CLASSPATH -proc:only -proc:none -encoding UTF-8 fqcn des implémentations -processor $PROCESSOR -d $PROJECT_HOMEtargetclasses -s $PROJECT_HOMEtargetgenerated- sourcesapt -sourcepath $SOURCE_PATH optionnel -verbose $FILES
  • 5. Appeler APT depuis maven • Le plugin maven-compiler avec des options passées « à la main » • Le plugin org.bsc.maven:maven-processor-plugin (google code)
  • 7. Exemple de processor  @SupportedAnnotationTypes pour déclarer l’annotation cible  Créer un FileObject pour écrire du contenu
  • 8. Meta modèle d’un fichier source java Quelques sous type d’Element que l’on caste en fonction de Element.getKind()
  • 9. Méta modèle d’un fichier source
  • 10. Comparaison avec java.lang.reflect Java.lang.reflect Javax.annotation.processing java.lang.Class TypeElement Constructor ExecutableElement Field, Parameter VariableElement Method ExecutableElement java.lang.Package PackageElement • NO Class.newInstance() • NO instanceOf, NO isAssignable() • NO getConstructor, getMethod, … • Impossible de tester l’arbre d’héritage lorsqu’on navigue dans le source d’une classe
  • 11. Ca sert à quoi ? • Injecter des patterns répétitifs et complexes • Générer des factories, des singletons • Générer des délégations avec du code de management – Assertions – Sonde JMX – Transaction – Gestion des data sources • Générer des rapports sur du code – Tables de références – Requêtes SQL embarquées dans le code java
  • 12. Pattern avec injection – je fais un framework • Annoter des beans ou des interfaces  Générer les implémentations ou les proxy  Injecter les implémentations  Générer les descripteurs pour le framework d’injection ou utiliser un classpath scanneur  Le code client ne doit pas avoir de références sur le code généré  Possibilité de mixer le code généré avec des annotation interprétées à runtime Utiliser les conventions de nommage des classes cibles et la réflection
  • 13. Analyse et transformation de code vers des fichiers plats • Générer des fichiers pour le tableurs  Cartographie des @Deprecated dans une base de code volumineuse  Données métiers pour de la documentation : les constantes de toutes les énumérations d’un modèle métier • Générer des fichiers properties  Configuration de l’application pour le staging (développement/recette/production)
  • 14. DSL avec des annotations • Ajouter des annotations qui paramètrent un pattern complexe Par exemple: le pattern pour des MBeans en ajoutant des méthodes de moyenne ou de dérivée en fonction du temps sur les sondes primitives • Le code client référence directement le code généré Le code généré ne peut pas être utilisé dans le même module requière une modularisation soigneuse
  • 15. No limit … • Tentation de générer trop de patterns • Un plugin APT est difficile à maintenir • Les tests unitaires sont complexes à écrire • Chronophage à debugger • Parfois plus de complexité dans un processeur APT que de maintenir un pattern à la main • Peu de références ou de support • Outillage inexistant pour le templating du code à générer Penser à utiliser freemarker ou velocity
  • 16. Compilation : une ou deux passes ? • Une passe  Le plugin APT s’exécute dans la même exécution que la compilation des sources java ‘statiques’  Le code source apparait directement sous forme de bytecode (.class)  Difficile à debugger en cas de soucis  Deux passes  On exécute javac en mode proc:only  Puis une deuxième fois en mode proc:none avec les sources générées dans le sourcepath  Le debug devient possible sur le code généré
  • 17. Templating • A votre guise ! • Respecter l’indentation classique java si vous travaillez en ‘deux passes’ • Un petit moteur de template tient dans une classe  Moteur de macro de apache ant
  • 18. APT dans mon IDE • La plupart des IDE sont configurés avec javac en mode proc:none Les IDE sont souvent configurable pour activer le mode de compilation ‘une passe’ Aucun support pour le mode ‘deux passes’ • En mode ‘deux passes’ : penser à configurer le répertoire de sources générées dans les projets de l’IDE