Quellcode-Analyse mit Java 6-APIs

von Seema Richard, Deepa Sobhana

Haben Sie jemals darüber nachgedacht, wie Tools wie Checkstyle oder FindBugs eine statische Codeanalyse durchführen oder wie integrierte Entwicklungsumgebungen (IDEs) wie NetBeans oder Eclipse schnelle Codekorrekturen ausführen oder die genauen Referenzen eines in Ihrem Code deklarierten Felds finden? In vielen Fällen verfügen IDEs über eigene APIs, um den Quellcode zu analysieren und eine Standardbaumstruktur zu generieren, die als abstrakter Syntaxbaum (AST) oder "Analysebaum" bezeichnet wird und für eine eingehendere Analyse der Quellelemente verwendet werden kann. Die gute Nachricht ist, dass es jetzt möglich ist, die genannten Aufgaben und vieles mehr mit Hilfe von drei neuen APIs zu erledigen, die in Java als Teil der Java Standard Edition 6-Version eingeführt wurden. Die APIs, die für Entwickler von Java-Anwendungen von Interesse sein könnten, die eine Quellcode-Analyse durchführen müssen, sind die Java Compiler-API (JSR 199).die Pluggable Annotation Processing API (JSR 269) und die Compiler Tree API.

In diesem Artikel untersuchen wir die Funktionen jeder dieser APIs und entwickeln eine einfache Demoanwendung, die bestimmte Java-Codierungsregeln für eine Reihe von Quellcodedateien überprüft, die als Eingabe bereitgestellt werden. Dieses Dienstprogramm zeigt auch die Meldungen zu Codierungsverletzungen sowie den Speicherort des verletzten Quellcodes als Ausgabe an. Stellen Sie sich eine einfache Java-Klasse vor, die die equals () -Methode der Object-Klasse überschreibt. Die zu überprüfende Codierungsregel lautet, dass jede Klasse, die die Methode equals () implementiert, auch die Methode hashcode () mit der richtigen Signatur überschreiben sollte. Sie können sehen, dass die folgende TestClass-Klasse die hashcode () -Methode nicht definiert, obwohl sie die equals () -Methode hat.

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

Lassen Sie uns diese Klasse im Rahmen des Erstellungsprozesses mithilfe dieser drei APIs analysieren.

Aufrufen des Compilers über Code: Die Java Compiler-API

Wir alle verwenden das javacBefehlszeilentool zum Kompilieren von Java-Quelldateien zu Klassendateien. Warum brauchen wir dann eine API, um Java-Dateien zu kompilieren? Die Antwort ist ganz einfach: Wie der Name schon sagt, können wir mit dieser neuen Standard-API den Compiler aus unseren eigenen Java-Anwendungen aufrufen. Sie können also programmgesteuert mit dem Compiler interagieren und so die Kompilierung zu einem Teil der Dienste auf Anwendungsebene machen. Einige typische Verwendungen dieser API sind unten aufgeführt.

  • Die Compiler-API hilft Anwendungsservern dabei, den Zeitaufwand für die Bereitstellung von Anwendungen zu minimieren, indem beispielsweise der Aufwand für die Verwendung eines externen Compilers zum Kompilieren der aus den JSP-Seiten generierten Servlet-Quellen vermieden wird.

  • Entwicklertools wie IDEs und Codeanalysatoren können den Compiler aus dem Editor heraus aufrufen oder Tools erstellen, die die Kompilierungszeit erheblich verkürzen.

Die Java-Compilerklassen sind unter dem javax.toolsPaket gepackt. Die ToolProviderKlasse dieses Pakets bietet eine Methode namens getSystemJavaCompiler(), die eine Instanz einer Klasse zurückgibt, die die JavaCompilerSchnittstelle implementiert . Diese Compilerinstanz kann verwendet werden, um eine Kompilierungsaufgabe zu erstellen, die die eigentliche Kompilierung ausführt. Die zu kompilierenden Java-Quelldateien werden dann an die Kompilierungsaufgabe übergeben. Zu diesem Zweck bietet die Compiler-API eine Dateimanager-Abstraktion mit dem Namen JavaFileManager, mit der Java-Dateien aus verschiedenen Quellen wie dem Dateisystem, Datenbanken, dem Speicher usw. abgerufen werden können. In diesem Beispiel verwenden wir StandardFileManagereinen Dateimanager, der auf basiert java.io.File. Der Standard-Dateimanager kann durch Aufrufen der getStandardFileManager()Methode von erworben werdenJavaCompilerBeispiel. Das Code-Snippet für die oben genannten Schritte ist unten dargestellt:

//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"); 

Optional kann ein Diagnose-Listener an die getStandardFileManager()Methode übergeben werden, um Diagnoseberichte über nicht schwerwiegende Probleme zu erstellen. In diesem Codeausschnitt übergeben wir nullWerte, da wir die Diagnose nicht vom Tool erfassen. Einzelheiten zu den anderen an diese Methoden übergebenen Parametern finden Sie in der Java 6-API. Die getJavaFileObjectsfromFiles()Methode von StandardJavaFileManagergibt alle JavaFileObjectInstanzen zurück, die den bereitgestellten Java-Quelldateien entsprechen.

Lesen Sie den Rest dieses Artikels

Diese Geschichte "Quellcode-Analyse mit Java 6-APIs" wurde ursprünglich von JavaWorld veröffentlicht.