Analiza izvornog koda pomoću Java 6 API-ja

Seema Richard, Deepa Sobhana

Jeste li ikad razmišljali o tome kako alati poput Checkstyle ili FindBugs vrše statičku analizu koda ili kako integrirana razvojna okruženja (IDE) poput NetBeans ili Eclipse izvršavaju brze popravke koda ili pronalaze točne reference polja deklariranog u vašem kodu? U mnogim slučajevima IDE-ovi imaju vlastite API-je za raščlanjivanje izvornog koda i generiranje standardne strukture stabla, koja se naziva Apstraktno sintaksno stablo (AST) ili "stablo raščlanjivanja", koja se može koristiti za dublju analizu izvornih elemenata. Dobra vijest je da je sada moguće izvršiti spomenute zadatke i puno više uz pomoć tri nova API-ja uvedena u Javi kao dio izdanja Java Standard Edition 6. API-ji koji bi mogli biti zanimljivi programerima Java aplikacija koje trebaju izvršiti analizu izvornog koda su Java Compiler API (JSR 199),API za obradu anotacija koji se može spojiti (JSR 269) i API stabla kompilatora.

U ovom članku istražujemo značajke svakog od ovih API-ja i nastavljamo s razvojem jednostavne demo aplikacije koja provjerava određena pravila Java kodiranja na skupu datoteka izvornog koda isporučenih kao ulaz. Ovaj uslužni program također prikazuje izlazne poruke kršenja kodiranja, kao i mjesto povrijeđenog izvornog koda. Razmotrimo jednostavnu Java klasu koja nadjačava metodu equals () klase Object. Pravilo kodiranja koje treba provjeriti je da svaka klasa koja implementira metodu equals () također treba nadjačati hashcode () metodu s odgovarajućim potpisom. Možete vidjeti da klasa TestClass u nastavku ne definira metodu hashcode (), iako ima metodu equals ().

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

Krenimo dalje i analizirajmo ovu klasu kao dio procesa izrade uz pomoć ova tri API-ja.

Pozivanje kompajlera iz koda: Java Compiler API

Svi koristimo javacalat naredbenog retka za kompajliranje Java izvornih datoteka u datoteke klase. Zašto nam onda treba API za kompajliranje Java datoteka? Pa, odgovor je vrlo jednostavan: kao što naziv opisuje, ovaj novi standardni API omogućuje nam pozivanje kompajlera iz vlastitih Java aplikacija; tj. programski možete komunicirati s kompajlerom i tako kompilaciju učiniti dijelom usluga na razini aplikacije. U nastavku su navedene neke tipične upotrebe ovog API-ja.

  • API kompajlera pomaže poslužiteljima aplikacija da smanje vrijeme potrebno za postavljanje aplikacija, na primjer, izbjegavajući općenite potrebe za korištenjem vanjskog prevoditelja za kompajliranje izvora servleta generiranih s JSP stranica.

  • Alati za programere poput IDE-a i analizatora koda mogu pozivati ​​kompajler iz uređivača ili graditi alate koji značajno smanjuju vrijeme kompajliranja.

Klase Java kompajlera zapakirane su u javax.toolspaketu. ToolProviderKlasa ovaj paket pruža metodu nazvanu getSystemJavaCompiler()da se vraća instanca neke klase koja implementira JavaCompilersučelje. Ova instanca kompajlera može se koristiti za stvaranje zadatka kompilacije koji će izvršiti stvarnu kompilaciju. Java izvorne datoteke koje će se kompajlirati tada će se proslijediti zadatku kompilacije. U tu svrhu API kompajlera nudi apstrakciju upravitelja datotekama JavaFileManagerkoja omogućava preuzimanje Java datoteka iz različitih izvora, kao što su datotečni sustav, baze podataka, memorija itd. U ovom uzorku koristimo StandardFileManagerupravitelj datoteka zasnovan na java.io.File. Standardni upravitelj datoteka može se dobiti pozivanjem getStandardFileManager()metodeJavaCompilerprimjer. Isječak koda za gore spomenute korake prikazan je u nastavku:

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

Dijagnostički slušatelj može se opcionalno proslijediti getStandardFileManager()metodi za izradu dijagnostičkih izvještaja o bilo kojim problemima koji nisu fatalni. U ovom isječku koda prosljeđujemo nullvrijednosti jer ne prikupljamo dijagnostiku iz alata. Pojedinosti o ostalim parametrima proslijeđenim ovim metodama potražite u Java 6 API. getJavaFileObjectsfromFiles()Metoda od StandardJavaFileManagervraća sve se JavaFileObjectslučajevi da odgovaraju za uporabu Java izvorne datoteke.

Pročitajte ostatak ovog članka

Ovu je priču "Analiza izvornog koda pomoću Java 6 API-ja" izvorno objavio JavaWorld.