Jaká je role ClassLoaderu v Javě?



Tento článek je komplexním průvodcem o tom, jak ClassLoader funguje v Javě. Diskutuje o typech, principech a metodách ClassLoader v Javě.

Při práci v Javě často používáme velké množství tříd. Tyto třídy Java nejsou v paměti načteny všechny najednou, místo toho jsou načteny, pokud to vyžaduje aplikace. Tady přichází na scénu Java ClassLoaders. V tomto článku tedy proberu, jak používat ClassLoader v Javě spolu s příklady.

V tomto článku se budeme zabývat následujícími tématy:





  1. Co je ClassLoader?
  2. Typy ClassLoader
  3. Principy ClassLoader
  4. Metody ClassLoader
  5. Vlastní ClassLoader

Pojďme začít!

Co je ClassLoader v Javě?

ClassLoader v Javě je volán prostředím Java Runtime Environment, aby dynamicky načítal třídy, kdykoli to vyžaduje aplikace v Virtuální stroj Java . Vzhledem k tomu, že ClassLoaders jsou součástí prostředí Java Runtime Environment, nebude mít virtuální stroj Java žádnou představu o podkladových souborech a souborových systémech.



Nyní pochopíme různé typy vestavěných ClassLoaders v Javě.

Typy ClassLoader v Javě

Různé typy ClassLoaders v Javě jsou následující:

Pojďme diskutovat o každém z nich jeden po druhém.



Extension ClassLoader

Jak název napovídá, Extension ClassLoader načte rozšíření základních tříd Java z JDK Knihovna rozšíření. Je podřízeným prvkem Bootstrap ClassLoader a načítá rozšíření z adresáře JRE / lib / text nebo z libovolného jiného adresáře uvedeného v systémové vlastnosti java.ext.dirs.

Aplikace nebo System ClassLoader

Aplikace nebo System ClassLoader je podřízeným prvkem Extension ClassLoader. Tento typ ClassLoader načte všechny třídy na úrovni aplikace nalezené v možnosti příkazového řádku -cp nebo v proměnné prostředí CLASSPATH.

Bootstrap ClassLoader

Jak to všichni víme Třídy Java jsou načteny instancí java.lang.ClassLoade. Ale protože ClassLoaders jsou třídy, je Bootstrap ClassLoader zodpovědný za načtení interních tříd JDK. BootStrap ClassLoader je strojový kód, který zahájí operaci, když ji JVM zavolá, a načte třídy z rt.jar. Takže můžete pochopit, že Bootstrap ClassLoader nemá žádný nadřazený ClassLoader a je tedy známý jako Primordial ClassLoader.

Poznámka: Priorita Bootstrap je vyšší než Extension a priorita daná Extension ClassLoader je vyšší než Application ClassLoader. Viz obrázek níže:

Typy ClassLoader - ClassLoader v Javě - Edureka

Dále v tomto článku pochopíme principy, na kterých ClassLoader funguje.

Principy ClassLoader v Javě

Sada pravidel, na jejichž základě Java ClassLoader funguje, jsou následující tři principy:

Rozumíme každému z nich.

Vlastnost jedinečnosti

Tato vlastnost zajišťuje, že nedochází k opakování tříd a všechny třídy jsou jedinečné. Vlastnost jedinečnosti také zajišťuje, že třídy načtené nadřazeným ClassLoader nebudou načteny podřízeným ClassLoader. Ve scénáři, kde nadřazený ClassLoader nemůže najít třídu, se aktuální instance pokusí o to sama.

Model delegace

ClassLoader v Javě funguje na základě sady operací daných modelem delegování. Takže kdykoli je generován požadavek na vyhledání třídy nebo prostředku, instance ClassLoader deleguje hledání třídy nebo prostředku na nadřazený ClassLoader.

Sada operací, na jejichž základě funguje ClassLoader, je následující:

  • Virtuální stroj Java zkontroluje, zda je třída načtena či nikoli, kdykoli na třídu narazí.
  • V případě, že je třída načtena JVM pokračuje s prováděním třídy, ale ve scénáři, kde třída není načtena, pakJVM požádá subsystém Java ClassLoader o načtení konkrétní třídy. Poté subsystém ClassLoader dává kontrolu nad Application ClassLoader.
  • Application ClassLoader poté deleguje požadavek na Extension ClassLoader, který poté předá požadavek Bootstrap ClassLoader.
  • Nyní Bootstrap ClassLoader hledá vBootstrap classpath ke kontrole, zda je třída k dispozici nebo ne. Pokud je třída k dispozici, pak se načte, jinak se požadavek znovu předá Extension ClassLoader.
  • Extension ClassLoader kontroluje třídu v rozšiřující třídě.Pokud je třída k dispozici, pak se načte, jinak se požadavek znovu předá Application ClassLoader.
  • Nakonec Application ClassLoader vyhledá třídu v classpath aplikace.Pokud je třída k dispozici, pak se načte, jinak uvidíte výjimku ClassNotFoundException.

Viz obrázek níže.

Princip viditelnosti

Podle tohoto principu jsou dětské třídy viditelné pro třídy načtené jeho nadřazenými ClassLoaders, ale naopak to není pravda. Takže třídy načtené Application ClassLoader mají viditelnost do tříd načtených Extension a Bootstrap ClassLoader.

Například pokud máme dvě třídy: A & B, předpokládejme, že třída A je načtena aplikací ClassLoader a třída B načtena pomocí Extension ClassLoader. Tady jsou třídy A a B viditelné pro všechny třídy načtené Application ClassLoader, ale třída B je viditelná pouze pro ty třídy načtené Extension ClassLoader.

Pokud se pokusíte načíst tyto třídy pomocí nástroje Bootstrap ClassLoader, zobrazí se java.lang.ClassNotFoundException . výjimka.

Dobře, teď, když znáte typy ClassLoaders a principy za nimi, pojďme se podívat na několik důležitých metodz java.lang.ClassLoader třída.

Metody ClassLoader v Javě

Málo zásadní ClassLoader jsou následující:

loadClass (název řetězce, logické řešení)

Tato metoda je vstupním bodem ClassLoaderu a používá se k načtení třídy, na kterou odkazuje JVM. Trvá název jako parametr. JVM vyvolá metodu loadClass () k vyřešení odkazů na třídy nastavením booleovské hodnoty na true. Pouze pokud potřebujeme zjistit, zda třída existuje nebo ne, je booleovský parametr nastaven na hodnotu false.

Prohlášení:

public Class loadClass (název řetězce, logické řešení) vyvolá ClassNotFoundException {

defineClass ()

Konečná metoda použitá k definování pole bajtů jako instance třídy. V případě, že je třída neplatná, vyvolá ClassFormatError.

Prohlášení:

chráněná konečná třída defineClass (název řetězce, bajt [] b, int vypnuto, int len) vyvolá ClassFormatError

findClass (název řetězce)

Metoda findClass se používá k vyhledání zadané třídy. Takže jen najde třídu s plně kvalifikovaným názvem jako parametr, ale nenačte třídu. Metoda loadClass () vyvolá tuto metodu, pokud nadřazený ClassLoader nemůže najít požadovanou třídu. Také pokud žádný rodič ClassLoader nenajde třídu, výchozí implementace vyvolá a ClassNotFoundException.

Prohlášení:

chráněná třída findClass (název řetězce) vyvolá ClassNotFoundException

Class.forName (název řetězce, booleovská inicializace, zavaděč ClassLoader)

Tato metoda se používá k načtení a inicializaci třídy. Poskytuje možnost vybrat kterýkoli z ClassLoaders a zapouzdřit parametr ClassLoader na NULL, pak se automaticky použije Bootstrap ClassLoader.

Prohlášení:

public static Class forName (String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException

getParent ()

Metoda getParent se používá k vrácení nadřazeného ClassLoader pro delegování.

Prohlášení:

veřejná finální ClassLoader getParent ()

getResource ()

Jak název napovídá, metoda getResource () se pokusila najít prostředek s daným názvem. Zpočátku deleguje požadavek na nadřazený ClassLoader pro prostředek. V případě, že nadřazený objekt má hodnotu null, je prohledána cesta ClassLoaderu zabudovaného do JVM. Nyní, pokud se to nezdaří, pak metoda vyvolá findResource (String) k vyhledání prostředku, kde je název zdroje zadán jako vstup, který může být absolutní nebo relativní classpath. Potom vrátí objekt URL pro čtení prostředku nebo vrátí hodnotu null, pokud prostředek nemá odpovídající oprávnění k vrácení prostředku nebo nebyl nalezen.

Prohlášení:

veřejná URL getResource (název řetězce)

Dále v tomto článku o ClassLoader v Javě pochopíme Custom ClassLoader.

Vlastní ClassLoader v Javě

Integrované ClassLoaders se postarají o většinu případů, kdy jsou soubory již v systému souborů, ale pokud chcete načíst třídy z místního pevného disku, musíte použít vlastní ClassLoaders.

jak používat AWS cli

Vytvořte vlastní ClassLoader

Chcete-li vytvořit vlastní ClassLoader, musíte rozšířit ClassLoader třídy a přepsat findClass () metoda:

Příklad: Vytvořme si vlastní ClassLoader, který rozšíří výchozí ClassLoader a načte bajtové pole ze zadaného souboru. Viz níže uvedený kód.

balíček edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream veřejná třída Ukázka rozšiřuje ClassLoader {@Override public Class findClass (String samplename) hodí ClassNotFoundException {byte [] b = customLoadClassFrom (samplename) return defineClass (samplename, b, 0, b.length)} soukromý bajt [] customLoadClassFromFile (řetězec demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', soubor. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = nový ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Tímto ukončujeme tento článek o ClassLoader v Javě. Doufám, že jste pochopili, co jsou ClassLoaders v Javě, její metody, různé typy ClassLoaders atd.

Pokud jste našli tento článek o „ClassLoader v Javě“, podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů rozložených po celém světě. Jsme tu, abychom vám pomohli s každým krokem na vaší cestě, abychom se kromě otázek týkajících se tohoto rozhovoru pro javu stali i učebním plánem, který je určen pro studenty a profesionály, kteří chtějí Jáva Vývojář.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů tohoto „ClassLoader v Javě ' a my se vám ozveme co nejdříve.