Analyse du code source à l'aide des API Java 6

par Seema Richard, Deepa Sobhana

Avez-vous déjà pensé à la façon dont des outils tels que Checkstyle ou FindBugs effectuent une analyse de code statique, ou comment les environnements de développement intégrés (IDE) tels que NetBeans ou Eclipse exécutent des correctifs de code rapide ou trouvent les références exactes d'un champ déclaré dans votre code? Dans de nombreux cas, les IDE ont leurs propres API pour analyser le code source et générer une arborescence standard, appelée arbre de syntaxe abstraite (AST) ou «arbre d'analyse», qui peut être utilisée pour une analyse plus approfondie des éléments source. La bonne nouvelle est qu'il est désormais possible d'accomplir lesdites tâches et bien plus encore à l'aide de trois nouvelles API introduites en Java dans le cadre de la version Java Standard Edition 6. Les API susceptibles d'intéresser les développeurs d'applications Java devant effectuer une analyse de code source sont l'API Java Compiler (JSR 199),l'API de traitement d'annotations enfichables (JSR 269) et l'API de l'arborescence du compilateur.

Dans cet article, nous explorons les fonctionnalités de chacune de ces API et développons une simple application de démonstration qui vérifie certaines règles de codage Java sur un ensemble de fichiers de code source fournis en entrée. Cet utilitaire affiche également les messages de violation de codage ainsi que l'emplacement du code source violé en sortie. Considérez une classe Java simple qui remplace la méthode equals () de la classe Object. La règle de codage à vérifier est que chaque classe qui implémente la méthode equals () doit également remplacer la méthode hashcode () avec la signature appropriée. Vous pouvez voir que la classe TestClass ci-dessous ne définit pas la méthode hashcode (), même si elle a la méthode equals ().

public class TestClass implements Serializable { int num; @Override public boolean equals(Object obj)  } 

Continuons et analysons cette classe dans le cadre du processus de construction à l'aide de ces trois API.

Appel du compilateur à partir du code: l'API du compilateur Java

Nous utilisons tous l' javacoutil de ligne de commande pour compiler les fichiers source Java en fichiers de classe. Alors pourquoi avons-nous besoin d'une API pour compiler des fichiers Java? Eh bien, la réponse est assez simple: comme son nom l'indique, cette nouvelle API standard nous permet d'appeler le compilateur à partir de nos propres applications Java; c'est-à-dire que vous pouvez interagir par programmation avec le compilateur et ainsi intégrer la compilation aux services de niveau application. Certaines utilisations typiques de cette API sont répertoriées ci-dessous.

  • L'API du compilateur aide les serveurs d'applications à réduire le temps nécessaire au déploiement des applications, par exemple, en évitant la surcharge liée à l'utilisation d'un compilateur externe pour compiler les sources de servlet générées à partir des pages JSP.

  • Les outils de développement tels que les IDE et les analyseurs de code peuvent appeler le compilateur à partir de l'éditeur ou créer des outils qui réduisent considérablement le temps de compilation.

Les classes du compilateur Java sont regroupées sous le javax.toolspackage. La ToolProviderclasse de ce package fournit une méthode appelée getSystemJavaCompiler()qui retourne une instance d'une classe qui implémente l' JavaCompilerinterface. Cette instance de compilateur peut être utilisée pour créer une tâche de compilation qui effectuera la compilation réelle. Les fichiers source Java à compiler seront ensuite transmis à la tâche de compilation. Pour cela, l'API du compilateur fournit une abstraction de gestionnaire de fichiers appelée JavaFileManager, qui permet aux fichiers Java d'être récupérés à partir de diverses sources, telles que le système de fichiers, les bases de données, la mémoire, etc. Dans cet exemple, nous utilisons StandardFileManagerun gestionnaire de fichiers basé sur java.io.File. Le gestionnaire de fichiers standard peut être acquis en appelant la getStandardFileManager()méthode duJavaCompilerexemple. L'extrait de code pour les étapes mentionnées ci-dessus est illustré ci-dessous:

//Get an instance of java compiler JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); //Get a new instance of the standard file manager implementation StandardJavaFileManager fileManager = compiler. getStandardFileManager(null, null, null); // Get the list of java file objects, in this case we have only // one file, TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles("TestClass.java"); 

Un auditeur de diagnostic peut éventuellement être transmis à la getStandardFileManager()méthode pour produire des rapports de diagnostic de tout problème non fatal. Dans cet extrait de code, nous transmettons des nullvaleurs, car nous ne collectons pas les diagnostics de l'outil. Pour plus de détails sur les autres paramètres passés à ces méthodes, reportez-vous à l'API Java 6. La getJavaFileObjectsfromFiles()méthode de StandardJavaFileManagerrenvoie toutes les JavaFileObjectinstances qui correspondent aux fichiers source Java fournis.

Lire la suite de cet article

Cette histoire, «Analyse du code source à l'aide des API Java 6», a été initialement publiée par JavaWorld.