Aká je úloha ClassLoadera v Jave?



Tento článok je komplexným sprievodcom o tom, ako ClassLoader pracuje v Jave. Rozoberá typy, princípy a metódy ClassLoader v Jave.

Pri práci v Jave často používame veľké množstvo tried. Tieto triedy Java sa do pamäte nenačítajú všetky naraz, namiesto toho sa načítajú, ak to vyžaduje aplikácia. To je miesto, kde prichádzajú na scénu Java ClassLoaders. V tomto článku teda budem diskutovať o tom, ako používať ClassLoader v Jave spolu s príkladmi.

V tomto článku sa budeme venovať nasledujúcim témam:





  1. Čo je ClassLoader?
  2. Typy ClassLoader
  3. Princípy ClassLoader
  4. Metódy ClassLoader
  5. Vlastný ClassLoader

Začnime!

Čo je ClassLoader v Jave?

ClassLoader v Jave sa volá Java Runtime Environment na dynamické načítanie tried, kedykoľvek to vyžaduje aplikácia v Virtuálny stroj Java . Pretože ClassLoaders sú súčasťou Java Runtime Environment, nebude mať Java Virtual Machine predstavu o základných súboroch a súborových systémoch.



Poďme teraz pochopiť rôzne typy vstavaných ClassLoaders v Jave.

Typy ClassLoader v Jave

Existujú rôzne typy ClassLoaders v Jave:

Poďme diskutovať každý z nich jeden po druhom.



Extension ClassLoader

Ako naznačuje názov, Extension ClassLoader načíta rozšírenia základných tried Java z JDK Knižnica rozšírenia. Je podriadeným prvkom Bootstrap ClassLoader a načíta prípony z adresára JRE / lib / text alebo z iného adresára uvedeného v systémovej vlastnosti java.ext.dirs.

Aplikácia alebo System ClassLoader

Aplikácia alebo System ClassLoader je potomkom Extension ClassLoader. Tento typ ClassLoader načítava všetky triedy na úrovni aplikácie, ktoré sa nachádzajú vo voľbe príkazového riadku -cp alebo v premennej prostredia CLASSPATH.

Bootstrap ClassLoader

Ako to všetci vieme Triedy Java sú načítané inštanciou java.lang.ClassLoade. Ale keďže ClassLoaders sú triedy, je Bootstrap ClassLoader zodpovedný za načítanie interných tried JDK. BootStrap ClassLoader je strojový kód, ktorý spustí operáciu, keď ju JVM zavolá, a načíta triedy z rt.jar. Takže môžete pochopiť, že Bootstrap ClassLoader nemá žiadny nadradený ClassLoader a je teda známy ako Primordial ClassLoader.

Poznámka: Priorita Bootstrap je vyššia ako Extension a priorita daná Extension ClassLoader je vyššia ako Application ClassLoader. Pozrite si obrázok nižšie:

Typy ClassLoader - ClassLoader v Jave - Edureka

Ďalej v tomto článku si objasnime princípy, na ktorých ClassLoader funguje.

Princípy ClassLoader v Jave

Sada pravidiel, na základe ktorých Java ClassLoader funguje, sú nasledujúce tri princípy:

Pochopme každého z nich.

Vlastnosť jedinečnosti

Táto vlastnosť zaisťuje, že sa triedy nebudú opakovať a všetky triedy sú jedinečné. Vlastnosť jedinečnosti tiež zaisťuje, aby triedy načítané nadradeným ClassLoaderom neboli načítané podradeným ClassLoaderom. V scenári, keď nadradený ClassLoader nemôže nájsť triedu, sa aktuálna inštancia pokúsi o to sama.

Model delegácie

ClassLoader v prostredí Java pracuje na základe súboru operácií zadaných v modeli delegovania. Takže vždy, keď sa vygeneruje požiadavka na nájdenie triedy alebo prostriedku, inštancia ClassLoader deleguje hľadanie triedy alebo prostriedku na nadradený ClassLoader.

Množina operácií, na základe ktorých ClassLoader funguje, je nasledovná:

  • Virtuálny počítač Java skontroluje, či je trieda načítaná alebo nie, kedykoľvek sa s triedou stretne.
  • V prípade, že je trieda načítaná JVM pokračuje vykonaním triedy, ale v scenári, kde sa trieda nenačíta, potomJVM požiada podsystém Java ClassLoader, aby načítal túto konkrétnu triedu. Potom subsystém ClassLoader dáva kontrolu nad Application ClassLoader.
  • Aplikácia ClassLoader potom deleguje požiadavku na Extension ClassLoader, ktorý potom odošle požiadavku Bootstrap ClassLoader.
  • Teraz Bootstrap ClassLoader vyhľadáva vBootstrap classpath na kontrolu, či je trieda k dispozícii alebo nie. Ak je trieda k dispozícii, potom sa načíta, inak sa požiadavka znova odovzdá Extension ClassLoader.
  • Extension ClassLoader skontroluje triedu v triede cesty rozšírenia.Ak je trieda k dispozícii, potom sa načíta, inak sa požiadavka znova odovzdá Application ClassLoader.
  • Nakoniec Application ClassLoader vyhľadá triedu v triede aplikácií.Ak je trieda k dispozícii, potom sa načíta, inak uvidíte výnimku ClassNotFoundException.

Pozrite si obrázok nižšie.

Princíp viditeľnosti

Podľa tohto princípu sú triedy pre deti viditeľné pre triedy načítané nadradenými nástrojmi ClassLoaders, ale naopak to nie je pravda. Triedy načítané Application ClassLoader teda majú viditeľnosť pre triedy načítané Extension a Bootstrap ClassLoader.

Napríklad, ak máme dve triedy: A & B, predpokladajme, že trieda A je načítaná pomocou Application ClassLoader a trieda B je načítaná pomocou Extension ClassLoader. Tu sú triedy A a B viditeľné pre všetky tie triedy načítané Application ClassLoaderom, ale trieda B je viditeľná iba pre tie triedy načítané Extension ClassLoader.

Ak sa pokúsite načítať tieto triedy pomocou nástroja Bootstrap ClassLoader, uvidíte tiež java.lang.ClassNotFoundException . výnimkou.

Dobre, teraz, keď poznáte typy ClassLoaderov a princípy, ktoré ich obklopujú, pozrime sa na niekoľko dôležitých metódz java.lang.ClassLoader trieda.

Metódy ClassLoader v Jave

Málo zásadných ClassLoader sú nasledovné:

loadClass (názov reťazca, logické riešenie)

Táto metóda je vstupným bodom ClassLoaderu a používa sa na načítanie triedy, na ktorú odkazuje JVM. Berie to názov ako parameter. JVM vyvolá metódu loadClass () na vyriešenie odkazov na triedy nastavením boolovskej hodnoty na true. Iba ak potrebujeme zistiť, či trieda existuje alebo nie, boolovský parameter je nastavený na hodnotu false.

Vyhlásenie:

public Class loadClass (názov reťazca, logické riešenie) hodí ClassNotFoundException {

defineClass ()

Posledná metóda používaná na definovanie poľa bajtov ako inštancie triedy. V prípade, že je trieda neplatná, hodí ClassFormatError.

Vyhlásenie:

chránená konečná trieda defineClass (názov reťazca, bajt [] b, int vypnutý, int len) vyvolá ClassFormatError

findClass (názov reťazca)

Na nájdenie zadanej triedy sa používa metóda findClass. Takže iba nájde triedu s plne kvalifikovaným názvom ako parametrom, ale nenačíta triedu. Metóda loadClass () vyvolá túto metódu, ak nadradený ClassLoader nemôže nájsť požadovanú triedu. Tiež, ak žiadny rodič ClassLoader nenájde triedu, predvolená implementácia hodí a ClassNotFoundException.

Vyhlásenie:

chránená trieda findClass (názov reťazca) vyvolá ClassNotFoundException

Class.forName (názov reťazca, boolovská inicializácia, načítač ClassLoader)

Táto metóda sa používa na načítanie a inicializáciu triedy. Dáva možnosť zvoliť si ktorýkoľvek z ClassLoaders a vložiť parameter ClassLoader do hodnoty NULL, potom sa automaticky použije Bootstrap ClassLoader.

Vyhlásenie:

public static Trieda preName (názov reťazca, boolovská inicializácia, načítač ClassLoader) hodí ClassNotFoundException

getParent ()

Metóda getParent sa používa na vrátenie nadradeného ClassLoader na delegovanie.

Vyhlásenie:

verejný konečný ClassLoader getParent ()

getResource ()

Ako naznačuje názov, metóda getResource () sa pokúsila nájsť zdroj s daným menom. Spočiatku deleguje požiadavku na nadradený ClassLoader pre daný prostriedok. V prípade, že rodič má hodnotu null, bude prehľadaná cesta ClassLoaderu zabudovaného do JVM. Teraz, ak sa to nepodarí, metóda vyvolá metódu findResource (String) na nájdenie zdroja, kde je názov zdroja zadaný ako vstup, ktorý môže byť absolútnou alebo relatívnou cestou triedy. Potom vráti objekt URL na čítanie prostriedku alebo vráti nulovú hodnotu, ak zdroj nemá primerané privilégiá na vrátenie prostriedku alebo sa nenájde.

Vyhlásenie:

verejná URL getResource (názov reťazca)

Ďalej si v tomto článku o ClassLoader v jazyku Java vysvetlíme vlastný ClassLoader.

Vlastný ClassLoader v Jave

Vstavané ClassLoaders sa postarajú o väčšinu prípadov, keď sú súbory už v súborovom systéme, ale ak chcete načítať triedy z lokálneho pevného disku, musíte využiť vlastné ClassLoaders.

ako používať AWS cli

Vytvorte si vlastný ClassLoader

Ak chcete vytvoriť vlastný ClassLoader, musíte rozšíriť ClassLoader triedy a prepísať findClass () metóda:

Príklad: Vytvorme si vlastný ClassLoader, ktorý rozšíri predvolený ClassLoader a načíta bajtové pole zo zadaného súboru. Prečítajte si kód uvedený nižšie.

balík edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream verejná trieda Ukážka rozširuje ClassLoader {@Override public Class findClass (String samplename) hodí ClassNotFoundException {byte [] b = customLoadClassFrom (samplename) return defineClass (samplename, b, 0, b.length)} súkromný bajt [] customLoadClassFromFile (reťazec demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', súbor. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = nový ByteArrayOutputStream () int nextValue = 0 vyskúšať {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Týmto sa dostávame ku koncu tohto článku o ClassLoader v Jave. Dúfam, že ste pochopili, čo sú ClassLoaders v Jave, jej metódy, rôzne typy ClassLoaders atď.

Ak ste našli tento článok o „ClassLoader v Jave“, pozrite si autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Sme tu, aby sme vám pomohli na každom kroku na vašej ceste. Aby sme sa stali otázkami okrem rozhovoru v jazyku Java, vymyslíme učebný plán určený pre študentov a profesionálov, ktorí chcú byť Java Vývojár.

Máte na nás otázku? Uveďte to, prosím, v sekcii komentárov tohto „ClassLoader v Jave a ozveme sa vám čo najskôr.