Programavimas

Šaltinio kodo analizė naudojant „Java 6“ API

Seema Richard, Deepa Sobhana

Ar kada pagalvojote, kaip tokie įrankiai kaip „Checkstyle“ ar „FindBugs“ atlieka statinio kodo analizę, ar kaip integruotos kūrimo aplinkos (IDE), pvz., „NetBeans“ ar „Eclipse“, vykdo greitus kodo taisymus ar suranda tikslias lauko nuorodas, deklaruotas jūsų kode? Daugeliu atvejų IDE turi savo API, kad būtų galima išanalizuoti šaltinio kodą ir sukurti standartinę medžio struktūrą, vadinamą Abstract Syntax Tree (AST) arba „parse tree“, kuri gali būti naudojama giliau analizuojant šaltinio elementus. Geros naujienos yra tai, kad dabar galima atlikti minėtas užduotis ir daug daugiau, naudojant tris naujas API, įdiegtas „Java“ kaip „Java Standard Edition 6“ leidimo dalį. API, kurios gali būti įdomios „Java“ programų, kurioms reikia atlikti kodo analizę, kūrėjams yra „Java Compiler API“ (JSR 199), „Pluggable Annotation Processing API“ (JSR 269) ir „Compiler Tree“ API.

Šiame straipsnyje mes ištyrėme kiekvienos iš šių API savybes ir toliau plėtojame paprastą demonstracinę programą, kuri patikrina tam tikras „Java“ kodavimo taisykles iš įvesties pateiktų šaltinio kodo failų rinkinyje. Šis įrankis taip pat rodo kodavimo pažeidimo pranešimus, taip pat pažeisto šaltinio kodo vietą kaip išvestį. Apsvarstykite paprastą „Java“ klasę, kuri nepaiso „Object“ klasės metodo „equals ()“. Tikrintina kodavimo taisyklė yra ta, kad kiekviena klasė, įgyvendinanti metodą equals (), taip pat turėtų nepaisyti hashcode () metodo su tinkamu parašu. Galite pamatyti, kad žemiau esanti „TestClass“ klasė neapibrėžia „hashcode“ () metodo, nors ir turi metodą „equals“).

viešoji klasė „TestClass“ įgyvendina „Serializable“ {int num; @Paisyti viešosios loginės loginės vertės lygu (Object obj)} 

Panagrinėkime šią klasę kaip sukūrimo proceso dalį naudodami šias tris API.

Kompiliatoriaus iškvietimas iš kodo: „Java Compiler“ API

Mes visi naudojame javac komandinės eilutės įrankis „Java“ šaltinio failams kaupti į klasės failus. Tada kodėl mums reikia API, kad galėtume sudaryti „Java“ failus? Na, atsakymas yra gana paprastas: kaip apibūdina pavadinimas, šis naujas standartinis API leidžia mums pakviesti kompiliatorių iš mūsų pačių „Java“ programų; y., galite programiškai bendrauti su kompiliatoriumi ir tokiu būdu kompiliavimą paversti programos lygio paslaugų dalimi. Kai kurie tipiniai šios API naudojimo būdai yra išvardyti žemiau.

  • Kompiliatoriaus API padeda programų serveriams sumažinti laiką, reikalingą diegti programas, pavyzdžiui, išvengiant išorinio kompiliatoriaus naudojimo sudedant servletų šaltinius, sukurtus iš JSP puslapių.

  • Kūrėjų įrankiai, pvz., IDE ir kodų analizatoriai, gali pakviesti kompiliatorių iš redaktoriaus arba sukurti įrankius, kurie žymiai sutrumpina kompiliavimo laiką.

„Java“ kompiliatoriaus klasės yra supakuotos į javax.tools pakuotė. „ToolProvider“ šio paketo klasėje pateikiamas metodas, vadinamas „getSystemJavaCompiler“ () kuris grąžina kažkokios klasės egzempliorių, kuris įgyvendina „JavaCompiler“ sąsaja. Šis kompiliatoriaus egzempliorius gali būti naudojamas kuriant kompiliavimo užduotį, kuri atliks faktinį kompiliavimą. Tada kompiliuojami Java šaltinio failai bus perduodami kompiliavimo užduočiai. Tam kompiliatoriaus API pateikia failų tvarkyklės abstrakciją, vadinamą „JavaFileManager“, leidžiančią gauti „Java“ failus iš įvairių šaltinių, tokių kaip failų sistema, duomenų bazės, atmintis ir pan. Šiame pavyzdyje mes naudojame „StandardFileManager“, failų tvarkyklė, pagrįsta java.io.Failas. Standartinį failų tvarkyklę galima įsigyti paskambinus „getStandardFileManager“ () metodas „JavaCompiler“ instancija. Aukščiau nurodytų veiksmų kodo fragmentas rodomas toliau:

// Gaukite Java kompiliatoriaus egzempliorių JavaCompiler compiler = ToolProvider.getSystemJavaCompiler (); // Gaukite naują standartinio failų tvarkyklės diegimo egzempliorių „StandardJavaFileManager“ fileManager = compiler. getStandardFileManager (null, null, null); // Gaukite „Java“ failų objektų sąrašą, šiuo atveju turime tik // vieną failą, TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles ("TestClass.java"); 

Diagnostikos klausytojas gali būti pasirinktinai perduotas „getStandardFileManager“ () metodas diagnozuoti ataskaitas apie visas nemirtinas problemas. Šiame kodo fragmente mes praeiname niekinis reikšmes, nes mes nerenkame diagnostikos iš įrankio. Išsamesnės informacijos apie kitus šiems metodams perduotus parametrus rasite „Java 6“ API. „getJavaFileObjectsfromFiles“ () metodas „StandardJavaFileManager“ grąžina visus „JavaFileObject“ egzempliorių, kurie atitinka pateiktus „Java“ šaltinio failus.

Perskaitykite likusią šio straipsnio dalį

Šią istoriją „Šaltinio kodo analizė naudojant„ Java 6 “API“ iš pradžių paskelbė „JavaWorld“.

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