Programovanie

Java Tip 105: Zvládnutie cesty ku triede s JWhich

Vývojári narazia na frustráciu pri práci s triedou Java Java. Nie vždy je jasné, ktorú triedu načíta trieda načíta, najmä keď je triedna cesta vašej aplikácie zaplavená adresármi a súbormi. V tomto článku predstavím nástroj, ktorý dokáže zobraziť absolútnu cestu k načítanému súboru triedy.

Základy triedy

Virtuálny stroj Java (JVM) zamestnáva nakladač tried na načítanie tried používaných aplikáciou podľa potreby. The CLASSPATH Premenná prostredia hovorí zavaděču tried, kde má nájsť triedy tretích strán a používateľom definované triedy. Classpath pre každú aplikáciu môžete určiť aj pomocou -classpath Argument príkazového riadka JVM, ktorý prepíše cestu triedy uvedenú v CLASSPATH premenná prostredia.

Položky triedy Classpath môžu byť adresáre, ktoré obsahujú súbory tried pre triedy, ktoré nie sú v balíku, koreňový adresár balíka pre triedy v balíku, alebo archívne súbory (napríklad súbory .zip alebo .jar), ktoré obsahujú triedy. Položky triedy Classpath sú v systémoch typu Unix oddelené dvojbodkou a v systémoch MS Windows.

Načítavače tried sú usporiadané v delegačnej hierarchii, pričom každý zavádzač tried má nakladač rodičovských tried. Keď je načítač triedy požiadaný o nájdenie triedy, predtým, ako sa pokúsi nájsť triedu samotnú, najskôr deleguje požiadavku na načítavač svojej nadradenej triedy. Zavádzač systémových tried, predvolený zavádzač tried poskytovaný JDK alebo JRE nainštalovanými vo vašom systéme, načítava triedy tretích strán a používateľom definované triedy pomocou nástroja CLASSPATH premenná prostredia alebo -classpath Argument príkazového riadku JVM. Načítač systémových tried deleguje na triedu rozšírenia načítanie tried, ktoré používajú mechanizmus rozšírenia Java. Zavádzač triedy rozšírenia deleguje na zavádzač triedy bootstrap (tu sa dolár zastaví!), Aby načítal základné triedy JDK.

Môžete vyvinúť špecializované nakladače tried, aby ste prispôsobili, ako JVM dynamicky načítava triedy. Napríklad väčšina motorov servletov používa zavádzač vlastných tried na dynamické opätovné načítanie tried servletov, ktoré sa zmenili v adresároch určených vo vlastnej triede ciest.

Načítavač tried má osobitný význam a veľké zdesenie, načíta triedy v poradí, v akom sa nachádzajú v triede cesty. Počnúc prvým vstupom do triedy classpath zavádza zavádzač tried každý zadaný adresár alebo archívny súbor a pokúša sa nájsť triedu na načítanie. Načíta sa prvá trieda, ktorú nájde so správnym menom, a všetky zostávajúce položky triedy sú ignorované.

Znie to jednoducho, však?

Klamstvo triedy

Či už si to pripúšťajú alebo nie, začiatočníci aj veteráni vývojárov Javy boli v určitom okamihu (zvyčajne v najhoršom možnom okamihu!) Podvedenou nepríjemnou cestou podvedení. Keď sa pre aplikáciu zvýši počet závislých tried tretích strán a tried definovaných používateľom, a cesta triedy sa stane skládkou pre každý mysliteľný adresár a archívny súbor, nie je vždy zrejmé, ktorú triedu zavádza trieda ako prvý. Platí to najmä v prípade nešťastnej udalosti, že classpath obsahuje duplicitné položky triedy. Pamätajte, že zavádzač tried načíta prvú správne pomenovanú triedu, ktorú nájde v triednej ceste, a efektívne „skryje“ všetky ostatné správne pomenované triedy s nižšou prednosťou.

Je až príliš ľahké stať sa obeťou tohto triku triedy. Po dlhom dni otroctva cez horúcu klávesnicu pripojíte adresár k ceste triedy v snahe získať do aplikácie najnovšiu a najlepšiu verziu triedy, pričom netušíte, že iná verzia triedy sa nachádza v adresári vyššia priorita v triede. Mám ťa!

JWhich: Jednoduchý nástroj pre cestu k triede

Problém prednosti, ktorý je vlastný deklarácii plochej cesty, nie je pre triednu cestu Java jedinečný. Na nájdenie riešenia problému stačí, ak budete stáť na pleciach legendárnych softvérových gigantov. Operačný systém Unix ktoré príkaz vezme meno a zobrazí cestu k súboru, ktorý by sa vykonal, keby bol názov vydaný ako príkaz. V podstate prechádza CESTA premenná prostredia na vyhľadanie prvého výskytu príkazu. To tiež znie ako mocný nástroj na správu cesty triedy Java. Inšpirovaný touto predstavou som sa pustil do napísania obslužného programu Java, ktorý by mohol prevziať názov triedy Java a zobraziť absolútny názov súboru triedy, ktorý by načítal načítač triedy, ako to predpisuje cesta triedy.

Nasledujúci príklad použitia JKtorý zobrazí absolútnu cestu k prvému výskytu súboru com.clarkware.ejb.ShoppingCartBean trieda, ktorá sa má načítať zavádzačom triedy, ktorý sa náhodou nachádza v adresári:

 > Java JWhich com.clarkware.ejb.ShoppingCartBean Class 'com.clarkware.ejb.ShoppingCartBean' nájdený v '/home/mclark/classes/com/clarkware/ejb/ShoppingCartBean.class' 

Nasledujúci príklad použitia JKtorý zobrazí absolútnu cestu k prvému výskytu súboru javax.servlet.http.HttpServlet trieda, ktorá sa má načítať pomocou nakladača tried, ktorý je zabalený v archívnom súbore:

 > Java JWhich javax.servlet.http.HttpServlet Class 'javax.servlet.http.HttpServlet' found in 'file: /home/mclark/lib/servlet.jar! /javax/servlet/http/HttpServlet.class' 

Ako JKtoré fungujú

Ak chcete jednoznačne určiť, ktorá trieda sa v triede načíta ako prvá, musíte sa dostať do mysle zavádzača tried. To nie je také ťažké, ako to znie - jednoducho sa ho opýtate! Príslušný zdrojový kód pre JKtorý nasleduje. Celý zdrojový kód nájdete v časti Zdroje.

1: public class JWhich {2: 3: / ** 4: * Vytlačí absolútny názov súboru triedy 5: * obsahujúci zadaný názov triedy, tak ako je predpísané 6: * aktuálnou cestou triedy. 7: * 8: * @param className Názov triedy. 9: * / 10: public static void which (String className) {11:12: if (! ClassName.startsWith ("/")) {13: className = "/" + className; 14:} 15: className = className.replace ('.', '/'); 16: className = className + ".class"; 17:18: java.net.URL classUrl = 19: new JWhich (). GetClass (). GetResource (className); 20:21: if (classUrl! = Null) {22: System.out.println ("\ nClass '" + className + 23: "' nájdené v \ n '" + classUrl.getFile () + "'"); 24:} else {25: System.out.println ("\ nClass '" + className + 26: "' sa nenašiel v \ n '" + 27: System.getProperty ("java.class.path") + "' "); 28:} 29:} 30: 31: public static void main (String args []) {32: if (args.length> 0) {33: JWhich.which (args [0]); 34:} else {35: System.err.println ("Použitie: java JWhich"); 36:} 37:} 38:} 

Najskôr musíte trochu pomasírovať názov triedy, aby ste dosiahli akceptáciu načítaním triedy (riadky 12 - 16). Prípravou „/“ k názvu triedy dáte nakladaču triedy pokyn, aby sa doslovne zhodoval s názvom triedy v rámci cesty triedy, namiesto aby sa snažil implicitne predponovať pred názov balíka vyvolávajúcej triedy. Konverzia každého výskytu znaku „.“ do „/“ naformátuje názov triedy ako platný názov zdroja URL požadovaný nakladačom triedy.

Ďalej sa načíta zavádzač triedy (riadky 18-19) na zdroj zodpovedajúci správne naformátovanému názvu triedy. Každý Trieda objekt udržuje odkaz na ClassLoader objekt, ktorý ho načítal, takže triedny nakladač, ktorý načítal JKtorý sa tu vypytuje samotná trieda. The Class.getResource () metóda sa skutočne deleguje na nakladač triedy, ktorý načítal triedu, vracajúci adresu URL na čítanie prostriedku súboru triedy, alebo nulový ak sa v aktuálnej ceste k triede nepodarilo nájsť prostriedok súboru triedy so zadaným názvom triedy.

Nakoniec sa zobrazí absolútna cesta k súboru triedy, ktorá obsahuje zadaný názov triedy, ak bola nájdená v aktuálnej ceste k triede (riadky 21 - 24). Ako pomôcka na ladenie, ak sa súbor triedy nenašiel v aktuálnej ceste k triede, získate hodnotu java.class.path vlastnosť systému na zobrazenie aktuálnej triedy (riadky 24-28).

Je ľahké si predstaviť, ako by bolo možné tento jednoduchý kúsok kódu vyvolať v servlete Java pomocou cesty servera motora servletu alebo Enterprise JavaBean (EJB) pomocou cesty servera EJB. Ak JKtorý triedy boli načítané pomocou vlastného nakladača tried v servletovom motore, potom by sa na nájdenie tried použil nakladač tried servletového motora. Ak zavádzač triedy servletovho modulu nie je schopný nájsť triedu, deleguje sa na nakladač svojej nadradenej triedy. Všeobecne, keď JKtorý je načítaný nakladačom tried, je schopný nájsť všetky triedy načítané nakladačom tried alebo ľubovoľnými nakladačmi nadradených tried.

Záver

Ak je nevyhnutnosťou matkou všetkého vynálezu, potom je nástroj, ktorý pomáha spravovať cestu k triede Java, dávno prekonaný. Diskusné skupiny a e-mailové zoznamy týkajúce sa jazyka Java sú plné otázok týkajúcich sa tejto cesty ku triede. Musíme znížiť bariéru vstupu nových vývojárov, aby sme všetci mohli pokračovať v práci na vyšších úrovniach abstrakcie. JKtorý je jednoduchý, ale výkonný nástroj, ktorý vám pomôže zvládnuť cestu triedy Java v akomkoľvek prostredí.

Mike Clark je nezávislý konzultant spoločnosti Clarkware Consulting so špecializáciou na architektúru, dizajn a vývoj na báze Java pomocou technológií J2EE. Nedávno dokončil vývoj a nasadenie servera na výmenu XML typu business-to-business (B2B) a v súčasnosti je konzultantom pre projekt budovania produktu riadenia výkonu J2EE.

Získajte viac informácií o tejto téme

  • Získajte celý zdrojový kód tohto článku

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/12/jwhich.zip

  • Plnohodnotná verzia programu JWhich vrátane validátora triedy je k dispozícii na adrese

    //www.clarkware.com/software/jwhich.zip

  • Oficiálna dokumentácia pre Sun JDK a informácie o tom, ako sa vysporiadava s triedou pre rôzne oficiálne podporované platformy, sú k dispozícii na stránke

    //java.sun.com/j2se/1.3/docs/tooldocs/findingclasses.html

  • Podrobnosti o tom, ako nastaviť cestu k triede na platformách Unix a Windows, nájdete v časti „Nastavenie cesty k triede“ na adrese:
  • Unix

    //java.sun.com/j2se/1.3/docs/tooldocs/solaris/classpath.html

  • Windows

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/classpath.html

  • Zobraziť všetky predchádzajúce Tipy pre Java a odovzdať svoje vlastné

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Ak chcete získať ďalšie triky Java, prihláste sa na bezplatný portál ITworld.com Java Tutor informačný bulletin

    //www.itworld.com/cgi-bin/subcontent12.cgi

  • Vystúpte v diskusii Java Beginner, ktorú moderuje JavaWorld autor Geoff Friesen

    //www.itworld.com/jump/jw-javatip105/forums.itworld.com/webx?14@@.ee6b804/1195!skip=1125

Tento príbeh, „Java Tip 105: Mastering the classpath with JWhich“, bol pôvodne publikovaný spoločnosťou JavaWorld.

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