autor: Seema Richard, Deepa Sobhana
Už jste někdy přemýšleli o tom, jak nástroje jako Checkstyle nebo FindBugs provádějí statickou analýzu kódu, nebo jak integrovaná vývojová prostředí (IDE) jako NetBeans nebo Eclipse provádějí rychlé opravy kódu nebo hledají přesné odkazy na pole deklarované v kódu? V mnoha případech mají IDE vlastní API pro analýzu zdrojového kódu a generování standardní stromové struktury, která se nazývá Abstract Syntax Tree (AST) nebo „parse tree“, což lze použít pro hlubší analýzu zdrojových prvků. Dobrou zprávou je, že je nyní možné splnit uvedené úkoly a mnohem více pomocí tří nových API zavedených v Javě jako součást vydání Java Standard Edition 6. Rozhraní API, která by mohla zajímat vývojáře aplikací Java, kteří potřebují provádět analýzu zdrojového kódu, jsou rozhraní Java Compiler API (JSR 199), Pluggable Annotation Processing API (JSR 269) a Compiler Tree API.
V tomto článku prozkoumáme funkce každého z těchto API a pokračujeme vývojem jednoduché ukázkové aplikace, která ověří určitá pravidla kódování Java na sadě souborů zdrojového kódu dodávaných jako vstup. Tento nástroj také zobrazuje zprávy o narušení kódování a umístění porušeného zdrojového kódu jako výstup. Zvažte jednoduchou třídu Java, která přepíše metodu equals () třídy Object. Pravidlo kódování, které se má ověřit, je, že každá třída, která implementuje metodu equals (), by měla také přepsat metodu hashcode () správným podpisem. Vidíte, že níže uvedená třída TestClass nedefinuje metodu hashcode (), přestože má metodu equals ().
veřejná třída TestClass implementuje Serializable {int num; @Override public boolean equals (Object obj)}
Pojďme pokračovat a analyzovat tuto třídu jako součást procesu sestavování pomocí těchto tří API.
Vyvolání kompilátoru z kódu: API Java Compiler
Všichni používáme javac
nástroj příkazového řádku pro kompilaci zdrojových souborů Java do souborů tříd. Proč tedy potřebujeme API ke kompilaci souborů Java? Odpověď je docela jednoduchá: jak název napovídá, umožňuje nám toto nové standardní API vyvolat kompilátor z našich vlastních Java aplikací; tj. můžete programově interagovat s kompilátorem a tím vytvořit kompilaci součástí služeb na úrovni aplikace. Níže jsou uvedena některá typická použití tohoto API.
API kompilátoru pomáhá aplikačním serverům minimalizovat čas potřebný k nasazení aplikací, například tím, že se vyhne režii použití externího kompilátoru pro kompilaci zdrojů servletů generovaných ze stránek JSP.
Nástroje pro vývojáře, jako jsou IDE a analyzátory kódu, mohou vyvolat kompilátor z editoru nebo vytvořit nástroje, které výrazně zkrátí čas kompilace.
Třídy kompilátoru Java jsou zabaleny pod javax.tools
balík. The ToolProvider
třída tohoto balíčku poskytuje metodu nazvanou getSystemJavaCompiler ()
která vrací instanci nějaké třídy, která implementuje JavaCompiler
rozhraní. Tuto instanci kompilátoru lze použít k vytvoření úlohy kompilace, která provede skutečnou kompilaci. Zdrojové soubory Java, které mají být kompilovány, budou poté předány kompilační úloze. K tomu poskytuje kompilátor API abstrakci správce souborů s názvem JavaFileManager
, který umožňuje načítání souborů Java z různých zdrojů, jako je souborový systém, databáze, paměť atd. V této ukázce používáme StandardFileManager
, správce souborů založený na java.io.soubor
. Standardní správce souborů lze získat voláním getStandardFileManager ()
metoda JavaCompiler
instance. Fragment kódu pro výše uvedené kroky je uveden níže:
// Získejte instanci kompilátoru Java JavaCompiler compiler = ToolProvider.getSystemJavaCompiler (); // Získejte novou instanci implementace standardního správce souborů StandardJavaFileManager fileManager = kompilátor. getStandardFileManager (null, null, null); // Získejte seznam objektů java souboru, v tomto případě máme pouze // jeden soubor TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles ("TestClass.java");
Diagnostický posluchač lze volitelně předat do getStandardFileManager ()
metoda pro vytváření diagnostických zpráv o všech nefatálních problémech. V tomto fragmentu kódu projdeme nula
hodnoty, protože neshromažďujeme diagnostiku z nástroje. Podrobnosti o dalších parametrech předaných těmto metodám najdete v rozhraní Java 6 API. The getJavaFileObjectsfromFiles ()
metoda StandardJavaFileManager
vrátí všechny JavaFileObject
instance, které odpovídají dodaným zdrojovým souborům Java.
Přečtěte si zbytek tohoto článku
Tento příběh, „Analýza zdrojového kódu pomocí API Java 6“, původně publikoval JavaWorld.