Classloader dinamichkeskaya osztály betöltése - dmitriymx blog
ClassLoader: dinamichkeskaya osztály betöltése

Itt egy egyszerű kérdés: hogyan osztályok azonosították a JVM. A helyes válasz: a teljes neve az osztály, amely a csomag nevét és az osztály nevét saját. Ebből azt a következtetést, hogy a program nem létezhet két osztály azonos a teljes nevét. Azonban ez nem az. Ennek általános iskolában, ahol azt tanultuk, a szabály „nem nullával osztani”, majd a középiskolában, mesélt a végtelen és a Java egy „kis fehér hazugság”.
Tény, hogy az osztályok által meghatározott csomag nevét, a saját nevét és az osztályt. rakodó, ClassLoader „y. Így a program lehet a két osztály azonos a teljes nevet és nem zavarják egymást.
Ezen és más finomságok ClassLoader „és ma fogunk beszélni.
Az egyik legfontosabb jellemzője a Java dinamikus osztály betöltése modell, amely lehetővé teszi, hogy töltse be a futtatható kódot, újratöltés nélkül a fő alkalmazás a JRE. Bármilyen osztály használt futási amúgy ben töltött fel rakodó Java. A program elején létrehozott három fő bootloader:
- Bootstrap ClassLoader - alapanyagok rakodó;
- Extension ClassLoader - kiterjesztések rakodó;
- Rendszer ClassLoader - boot loader.
Bootstrap ClassLoader végre szintjén JVM és nincs visszacsatolás a futási környezetben. Az betölti osztályok a könyvtárban $ HOME / lib és az összes alapvető osztályok. Ezért arra törekszik, hogy kapjunk osztálybetöltése java. * Mindig végződik null'om. De ha igazán akarjuk, hogy ellenőrizzék a bázis osztály betöltése, akkor -Xbootclasspath gombot. amely lehetővé teszi, hogy felülbírálja a készlet bázis osztályok.
Extension ClassLoader terhelések osztályok a könyvtárban $ HOME / lib / ext. A Sun JRE - egy osztály sun.misc.Launcher $ ExtClassLoader. Bővítmények kezelése Használhatja a csomagtartó rendszer java.ext.dirs opciót.
Rendszer ClassLoader végre már a JRE szintet. A Sun JRE - egy osztály sun.misc.Launcher $ AppClassLoader. Ez betölti osztályok, az utat, amely meg van adva a CLASSPATH környezeti változó. Irányítsd a rakodási rendszer osztályok használatával -classpath vagy Option gomb
classloader képeznek hierarchiát, amely egy gyökér bázis rakodó. Minden más rakodók inicializálásnál megtartják egy linket a szülő rakodó. Így érhető megvalósítás betöltése felhatalmazás modell szerint.

osztály letöltés jobb rekurzív delegált az alsó rakodó a hierarchiában a legmagasabb. Ez a megközelítés lehetővé teszi a betöltőt az osztályok, amelyek olyan közel, hogy a bázis. Ez megvalósítja a maximális teret az osztály. Hatálya alá jelenti: minden letöltött nyilvántartja az osztályok, amelyek tele velük. Sok ilyen osztályok és ezek a területek jelennek meg. Ebben az esetben a betöltő látja, csak a „saját” osztály és az osztály „szülő” és fogalma sincs arról, az osztályok, amelyek már betöltött ő „leszármazottja”.
Tekintsük feltöltési folyamat részletesebben. Hagyja futásidejű találkozott változódeklaráció használja az osztály Bagira. Ezután az osztály keresést és letöltési folyamat a következő lesz:

Most gondolom: mi osztály valóban betöltve, ha a $ HOME / lib / ext és a CLASSPATH órájuk ugyanolyan teljes nevét? Ez így van, az osztály a $ HOME / lib / ext. és senki sem nézi a CLASSPATH. Bár mindent nem csak neki: osztályokat betölteni a sorrendben, ahogy azokat a megadott CLASSPATH. Ezen a ponton, ha a két jar-fájl, például a.jar és b.jar, amely ugyanazokat az osztályokat, emlékére a betöltött osztály a.jar, és az osztály b.jar lehet kihagyni
Ismétlem: minden ClassLoader látja „saját” osztály és az osztály „szülő”. Osztály „leszármazottai”, sokkal kevésbé osztályok „párhuzamosan futó” letöltők, az ClassLoader nem lát. Sőt, a JVM - ezek a különböző osztályok. Ha megpróbálja, hogy egy osztályba a másikra fog okozni java.lang.ClassCastException kivétel. akkor is, ha azok azonosak, és teljes nevét.
Most, a szavakat tettek. Ha fogunk létrehozni egy osztálybetöltő, fontos megjegyezni a következőket:
- rakodó kell explicit vagy implicit módon bővíteni java.lang.Classloader osztály;
- rakodó felhatalmazás modell támogatnia kell a terhelést a hierarchiában. Ha ez nem történik meg, nem lehet probléma a körét;
- osztályban java.lang.Classloader már megvalósított módszer a közvetlen letöltés - defineClass (). amely átalakítja a byte kódot java.lang.Class. elvégzése annak érvényesítését;
- rekurzív keresés mechanizmusa is végrehajtották az osztályban java.lang.Classloader és vigyázni, nem szükséges;
- megfelelő végrehajtásához a rakodó elegendő felülbírálja az eljárás loadClass (class java.lang.Classloader).
A boot loader betölti a jar-fájl nem a java.net.URLClassLoader. és „kézzel”. Így lesz tisztábban látni az egész folyamatot. És mi lesz a hajó egyik beépülő modult található plugins / mappába, és a felület, amelyre szeretné leírni:
Most írni a boot loader. Az igazság az, hogy olyan kis smuhlyuem és betölti a bővítményt, ha az összes osztályok memória:
Most levelet alapvető alkalmazást a feltöltő
Kitűnő. Továbbra is írni a plugin:
Mi csomagolni plug-in jar és tárolja a plugins / könyvtárba.
Igen, mi egy kicsit „csalni”, mereven rámutatva, hogy a fő alkalmazás, amely osztály tekinthető egy belépési pont, de ez nem befolyásolja az összképet, hogy mi történik. A program sikeresen betölteni a plug-in, és meg kell felelnie a módszer run ().
Ja, majdnem elfelejtettem. ”. A program lehet két osztályba az azonos teljes nevét, és ne zavarják egymást. ”. Emlékszem, emlékszem most mutatnak.
Voila, két azonos osztályú munkát értünk, és nem ellentétesek. Azonban, ha megpróbáljuk ezt: a JVM küldi el a pokolba (java.lang.ClassCastException), mert a JVM két teljesen különböző osztályban.