Créer son propre IDE avec l'API de compilation Java

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 :


Fichier(s) joint(s) :

0 commentaires: