Depuis Java 6, il est possible de générer à la volée des classes et de les compiler. En effet, le package javax.tools
donne accès à toute la panoplie nécessaire pour créer dynamiquement des classes à partir de simples String contenant le code : JavaCompiler
qui est une implémentation du compilateur lui-même, JavaFileObject
représentant de manière abstraite les fichiers (.java) et DiagnosticListener
qui récupère en sortie toutes les informations de la compilation (erreurs, lignes, messages...).
Il est même possible de compiler (et exécuter) des classes virtuellement, uniquement en mémoire, sans avoir à physiquement créer les fichiers sources ou les fichiers compilés.
Pour tester et illustrer ceci, j'ai créé un petit projet d'IDE (sous Netbeans), qui permet de taper du code source Java qui sera introduit dans la méthode "main" d'une classe, puis compilé et exécuté (en mémoire ou physiquement). Les résultats de l'exécution (sorties standards ou erreurs de compilation) sont redirigés vers une "console" créée pour l'occasion.
Voici quelques captures :
Comme on peut le voir, il est tout à fait possible d'exécuter n'importe quel code... J'ai ici implémenté le choix entre l'exécution du code à partir d'une classe compilée sur le disque à partir du fichier .java ou en mémoire. La "console" (en réalité un simple JTextArea) récupère n'importe quelle sortie faite par System.out.println
On peut voir, à l'arrière-plan, la classe compilée (ici en dur DynamicCompilation
) crée au sein du projet (destination elle-même pour l'exemple en dur).
Bien sûr cet exemple n'est qu'une ébauche de ce qui est faisable avec un IDE, mais cela laisse entrevoir les possibilités et permet de comprendre un peu plus le fonctionnement de nos outils quotidiens!
J'ai joint à cet article les sources de mon projet afin que vous puissiez les parcourir rapidement, mais je vous conseille d'aller consulter en détails les liens d'où je tire ces exemples. Bon courage!
Sources :
- http://accordess.com/wpblog/2011/03/06/an-overview-of-java-compilation-api-jsr-199/
- http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm
- http://www.ibm.com/developerworks/java/library/j-jcomp/index.html
- http://www.developpez.net/forums/d1009680/java/general-java/langage/compilation-personnalise-javacompiler/
0 commentaires:
Enregistrer un commentaire