Programovanie

Analýza zdrojového kódu pomocou rozhraní API Java 6

autor: Seema Richard, Deepa Sobhana

Už ste niekedy premýšľali o tom, ako nástroje ako Checkstyle alebo FindBugs vykonávajú statickú analýzu kódu, alebo ako integrované vývojové prostredia (IDE) ako NetBeans alebo Eclipse vykonávajú rýchle opravy kódu alebo hľadajú presné odkazy na pole deklarované v kóde? V mnohých prípadoch majú IDE svoje vlastné API na analýzu zdrojového kódu a generovanie štandardnej stromovej štruktúry, ktorá sa nazýva Abstract Syntax Tree (AST) alebo „syntaktický strom“ a ktorú je možné použiť na hlbšiu analýzu zdrojových prvkov. Dobrou správou je, že je teraz možné splniť uvedené úlohy a oveľa viac pomocou troch nových rozhraní API zavedených v prostredí Java ako súčasť vydania Java Standard Edition 6. Rozhrania API, ktoré by mohli zaujímať vývojárov aplikácií Java, ktorí potrebujú vykonať analýzu zdrojového kódu, sú rozhranie Java Compiler API (JSR 199), Pluggable Annotation Processing API (JSR 269) a Compiler Tree API.

V tomto článku skúmame vlastnosti každého z týchto rozhraní API a pokračujeme vývojom jednoduchej ukážkovej aplikácie, ktorá overuje určité pravidlá kódovania Java na množine súborov zdrojových kódov dodávaných ako vstup. Tento nástroj tiež zobrazuje výstupné správy o narušení kódovania, ako aj umiestnenie porušeného zdrojového kódu. Zvážte jednoduchú triedu Java, ktorá prepíše metódu equals () triedy Object. Pravidlo kódovania, ktoré sa má overiť, je, že každá trieda, ktorá implementuje metódu equals (), by mala tiež metódu hashcode () prepísať správnym podpisom. Môžete vidieť, že nižšie uvedená trieda TestClass nedefinuje metódu hashcode (), aj keď má metódu equals ().

verejná trieda TestClass implementuje Serializable {int num; @Override public boolean equals (Object obj)} 

Poďme ďalej a analyzujme túto triedu ako súčasť procesu zostavovania pomocou týchto troch rozhraní API.

Vyvolanie kompilátora z kódu: API Java Compiler

Všetci používame javac nástroj príkazového riadku na kompiláciu zdrojových súborov Java do súborov triedy. Prečo potom potrebujeme API na kompiláciu súborov Java? Odpoveď je celkom jednoduchá: ako názov napovedá, toto nové štandardné API nám umožňuje vyvolať kompilátor z našich vlastných aplikácií Java; tj. môžete programovo interagovať s kompilátorom a vytvoriť tak kompiláciu súčasťou služieb na úrovni aplikácie. Niektoré typické použitia tohto rozhrania API sú uvedené nižšie.

  • Kompilátor API pomáha aplikačným serverom minimalizovať čas potrebný na nasadenie aplikácií, napríklad vylúčením réžie pri použití externého kompilátora na kompiláciu zdrojov servletov generovaných zo stránok JSP.

  • Vývojárske nástroje, ako sú IDE a analyzátory kódu, môžu vyvolať kompilátor z editora alebo vytvoriť nástroje, ktoré výrazne skracujú čas kompilácie.

Triedy kompilátorov Java sú zabalené pod javax.tools balíček. The ToolProvider trieda tohto balíka poskytuje metódu s názvom getSystemJavaCompiler () ktorá vráti inštanciu nejakej triedy, ktorá implementuje JavaCompiler rozhranie. Túto inštanciu kompilátora možno použiť na vytvorenie úlohy kompilácie, ktorá vykoná skutočnú kompiláciu. Zdrojové súbory Java, ktoré sa majú kompilovať, sa potom odovzdajú úlohe kompilácie. Z tohto dôvodu poskytuje kompilátor API abstrakciu správcu súborov s názvom JavaFileManager, ktorá umožňuje načítanie súborov Java z rôznych zdrojov, ako je napríklad súborový systém, databázy, pamäť atď. V tejto vzorke používame StandardFileManager, správca súborov založený na java.io.Súbor. Štandardného správcu súborov je možné získať zavolaním na server getStandardFileManager () metóda JavaCompiler inštancia. Fragment kódu pre vyššie uvedené kroky je uvedený nižšie:

// Získajte inštanciu kompilátora Java JavaCompiler compiler = ToolProvider.getSystemJavaCompiler (); // Získajte novú inštanciu implementácie štandardného správcu súborov StandardJavaFileManager fileManager = kompilátor. getStandardFileManager (null, null, null); // Získajte zoznam objektov súborov Java, v tomto prípade máme iba // jeden súbor TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles ("TestClass.java"); 

Diagnostický poslucháč môže byť voliteľne odovzdaný do getStandardFileManager () metóda na výrobu diagnostických správ o všetkých problémoch, ktoré nie sú smrteľné. V tomto útržku kódu si odovzdáme nulový hodnoty, pretože nezhromažďujeme diagnostiku z nástroja. Podrobnosti o ďalších parametroch odovzdaných týmto metódam nájdete v rozhraní Java 6 API. The getJavaFileObjectsfromFiles () metóda StandardJavaFileManager vráti všetky JavaFileObject inštancie, ktoré zodpovedajú dodaným zdrojovým súborom Java.

Prečítajte si zvyšok tohto článku

Tento príbeh, „Analýza zdrojového kódu pomocou rozhraní API Java 6“, bol pôvodne publikovaný spoločnosťou JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found