Programmering

Kildekodeanalyse ved hjælp af Java 6 API'er

af Seema Richard, Deepa Sobhana

Har du nogensinde tænkt på, hvordan værktøjer som Checkstyle eller FindBugs udfører en statisk kodeanalyse, eller hvordan Integrated Development Environments (IDE'er) som NetBeans eller Eclipse udfører hurtige kodefixer eller finder de nøjagtige referencer til et felt, der er angivet i din kode? I mange tilfælde har IDE'er deres egne API'er til at analysere kildekoden og generere en standard træstruktur, kaldet et Abstract Syntax Tree (AST) eller "parse-træ", som kan bruges til dybere analyse af kildeelementerne. Den gode nyhed er, at det nu er muligt at udføre de nævnte opgaver plus meget mere ved hjælp af tre nye API'er introduceret i Java som en del af Java Standard Edition 6-udgivelsen. De API'er, der kan være af interesse for udviklere af Java-applikationer, der har brug for at udføre kildekodeanalyse, er Java Compiler API (JSR 199), Pluggable Annotation Processing API (JSR 269) og Compiler Tree API.

I denne artikel undersøger vi funktionerne i hver af disse API'er og fortsætter med at udvikle en simpel demo-applikation, der verificerer visse Java-kodningsregler på et sæt kildekodefiler, der leveres som input. Dette værktøj viser også kodningsovertrædelsesmeddelelserne samt placeringen af ​​den overtrådte kildekode som output. Overvej en simpel Java-klasse, der tilsidesætter ligemetoden () i Object-klassen. Den kodningsregel, der skal verificeres, er, at hver klasse, der implementerer ligemetoden (), også bør tilsidesætte hashkode () -metoden med den korrekte signatur. Du kan se, at TestClass-klassen nedenfor ikke definerer metoden hashcode (), selvom den har lig () -metoden.

offentlig klasse TestClass implementerer Serialiserbar {int num; @Override offentlige boolske lig (Objekt obj)} 

Lad os fortsætte med at analysere denne klasse som en del af byggeprocessen ved hjælp af disse tre API'er.

Påkaldelse af kompilatoren fra kode: Java Compiler API

Vi bruger alle javac kommandolinjeværktøj til kompilering af Java-kildefiler til klassefiler. Så hvorfor har vi brug for en API til at kompilere Java-filer? Svaret er ret simpelt: Som navnet beskriver, lader denne nye standard API os påberåbe compileren fra vores egne Java-applikationer; dvs. du kan programmere interagere med kompilatoren og derved gøre kompilering til en del af tjenester på applikationsniveau. Nogle typiske anvendelser af denne API er angivet nedenfor.

  • Compiler API hjælper applikationsservere med at minimere den tid, det tager at implementere applikationer, for eksempel ved at undgå omkostningerne ved at bruge en ekstern compiler til at kompilere de servletkilder, der genereres fra JSP-siderne.

  • Udviklerværktøjer som IDE'er og kodeanalysatorer kan påberåbe compileren fra editoren eller opbygge værktøjer, der reducerer kompileringstiden betydeligt.

Java-kompilerklasser er pakket under javax.tools pakke. Det ToolProvider klasse i denne pakke giver en metode kaldet getSystemJavaCompiler () der returnerer en forekomst af en klasse, der implementerer JavaCompiler interface. Denne kompilatorforekomst kan bruges til at oprette en kompileringsopgave, der udfører den aktuelle kompilering. De Java-kildefiler, der skal kompileres, sendes derefter til kompileringsopgaven. Til dette giver compiler API en filhåndterings abstraktion kaldet JavaFileManager, som gør det muligt at hente Java-filer fra forskellige kilder, såsom filsystemet, databaser, hukommelse osv. I denne prøve bruger vi StandardFileManager, en filhåndtering baseret på java.io-fil. Standardfilhåndteringen kan anskaffes ved at ringe til getStandardFileManager () metode til JavaCompiler eksempel. Kodestykket til de ovennævnte trin vises nedenfor:

// Få en forekomst af Java-kompilator JavaCompiler-kompilator = ToolProvider.getSystemJavaCompiler (); // Få en ny forekomst af standardfilhåndteringsimplementeringen StandardJavaFileManager fileManager = compiler. getStandardFileManager (null, null, null); // Hent listen over java-filobjekter, i dette tilfælde har vi kun // en fil, TestClass.java Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles ("TestClass.java"); 

En diagnostisk lytter kan valgfrit sendes til getStandardFileManager () metode til at producere diagnostiske rapporter om ikke-fatale problemer. I dette kodestykke videregiver vi nul værdier, da vi ikke samler diagnosen fra værktøjet. For detaljer om de andre parametre, der sendes til disse metoder, henvises til Java 6 API. Det getJavaFileObjectsfromFiles () metode til StandardJavaFileManager returnerer alle JavaFileObject forekomster, der svarer til de leverede Java-kildefiler.

Læs resten af ​​denne artikel

Denne historie, "Source Code Analysis Using Java 6 APIs" blev oprindeligt udgivet af JavaWorld.