Mi a ClassLoader szerepe a Java-ban?



Ez a cikk egy átfogó útmutató arról, hogyan működik a ClassLoader Java-ban. Megbeszéli a Java-ban található ClassLoader típusait, alapelveit és módszereit.

A Java-ban végzett munka során gyakran nagyszámú osztályt használunk. Ezek a Java osztályok nem töltődnek be egyszerre a memóriába, ehelyett betöltődnek, ha egy alkalmazás megköveteli. Itt jönnek a képbe a Java ClassLoaders. Tehát ebben a cikkben a példákkal együtt megvitatom a ClassLoader használatát a Java-ban.

A cikk a következő témákkal foglalkozik:





  1. Mi az a ClassLoader?
  2. A ClassLoader típusai
  3. A ClassLoader alapelvei
  4. A ClassLoader módszerei
  5. Custom ClassLoader

Kezdjük!

Mi az a ClassLoader a Java-ban?

A Java-ban lévő ClassLoader programot a Java Runtime Environment hívja meg, hogy dinamikusan töltse be az osztályokat, amikor az alkalmazás megköveteli a Java virtuális gép . Mivel a ClassLoaders a Java futásidejű környezet része, a Java virtuális gépnek fogalma sincs a mögöttes fájlokról és fájlrendszerekről.



Most pedig ismerjük meg a Java beépített ClassLoader típusait.

A ClassLoader típusai a Java-ban

A Java-ban a ClassLoaders különféle típusai a következők:

Beszéljük meg mindegyiket egyenként.



Extension ClassLoader

Ahogy a neve is sugallja, az Extension ClassLoader betölti az alapvető Java osztályok kiterjesztéseit a JDK Bővítő könyvtár. Ez a Bootstrap ClassLoader gyermeke, és betölti a kiterjesztéseket a JRE / lib / text könyvtárból vagy a java.ext.dirs rendszer tulajdonságban megadott bármely más könyvtárból.

Alkalmazás vagy System ClassLoader

Az alkalmazás vagy a System ClassLoader az Extension ClassLoader gyermekei. Ez a típusú ClassLoader betölti az összes alkalmazásszintű osztályt, amely megtalálható a -cp parancssori opcióban vagy a CLASSPATH környezeti változóban.

Bootstrap ClassLoader

Amint mindannyian tudjuk Java osztályok egy példánya tölti be java.lang.ClassLoade. De mivel a ClassLoaders osztályok, a Bootstrap ClassLoader felelős a JDK belső osztályainak betöltéséért. A BootStrap ClassLoader egy olyan gépi kód, amely akkor indítja el a műveletet, amikor a JVM meghívja, és az osztályokat az rt.jar fájlból tölti be. Tehát megértheti, hogy a Bootstrap ClassLoader kiszolgálója nem rendelkezik szülő ClassLoaderrel, és így Primordial ClassLoader néven ismert.

Jegyzet: A Bootstrap prioritása magasabb, mint az Extension, és az Extension ClassLoader prioritása magasabb, mint az Application ClassLoader. Lásd az alábbi képet:

A ClassLoader - ClassLoader típusai Java-ban - Edureka

Ebben a cikkben ezután ismerjük meg azokat az elveket, amelyek alapján a ClassLoader működik.

A ClassLoader alapelvei Java-ban

A Java ClassLoader működési szabályrendszere a következő három alapelv:

Értsük meg mindegyiket.

Egyediség tulajdonság

Ez a tulajdonság biztosítja, hogy az osztályok ne ismétlődjenek, és az összes osztály egyedi. Az egyediség tulajdonság azt is biztosítja, hogy az osztályokat a szülő ClassLoader töltse be, és ne a gyermek ClassLoader töltse be. Olyan esetekben, amikor a szülő ClassLoader nem találja az osztályt, akkor az aktuális példány megpróbálja ezt önmagában megtenni.

mi a char a java-ban

Delegációs modell

A ClassLoader a Java-ban a Delegációs modell által megadott műveletek alapján működik. Tehát, amikor egy osztály vagy erőforrás megkeresésére generálnak kérést, akkor a ClassLoader példány az osztály vagy az erőforrás keresését átruházza a szülő ClassLoaderre.

A ClassLoader műveleteinek összessége a következő:

  • A Java virtuális gép ellenőrzi, hogy az osztály betöltődik-e vagy sem, amikor csak találkozik egy osztállyal.
  • Abban az esetben, ha az osztály betöltődik JVM az osztály végrehajtásával folytatódik, de abban az esetben, ha az osztály nincs betöltve, akkorA JVM arra kéri a Java ClassLoader alrendszert, hogy töltse be az adott osztályt. Ezt követően a ClassLoader alrendszer biztosítja az irányítást az Application ClassLoader számára.
  • Az Application ClassLoader ezután átruházza a kérést az Extension ClassLoaderre, amely ezt követően továbbítja a kérést a Bootstrap ClassLoader-hez.
  • Most a Bootstrap ClassLoader keresést végez aBootstrap classpath annak ellenőrzésére, hogy az osztály elérhető-e vagy sem. Ha az osztály elérhető, akkor betöltődik, különben a kérés ismét továbbadódik az Extension ClassLoader-nek.
  • Az Extension ClassLoader ellenőrzi az osztályt a kiterjesztés osztályútvonalán.Ha az osztály elérhető, akkor betöltődik, különben a kérés ismét továbbadódik az Application ClassLoader alkalmazásnak.
  • Végül az Application ClassLoader megkeresi az osztályt az alkalmazás osztályútvonalán.Ha az osztály elérhető, akkor betöltődik, különben a ClassNotFoundException kivétel jelenik meg.

Lásd az alábbi képet.

Láthatósági elv

Ezen elv szerint a gyermekosztályok láthatók a szülő ClassLoaders által betöltött osztályok számára, de fordítva nem igaz. Tehát az Application ClassLoader által betöltött osztályok láthatók az Extension és a Bootstrap ClassLoader által betöltött osztályokba.

Például, ha két osztályunk van: A és B, tegyük fel, hogy az A osztályt az Application ClassLoader, a B osztályt pedig az Extensions ClassLoader tölti be. Itt az A és B osztályok láthatók mindazoknak az osztályoknak, amelyeket az Application ClassLoader töltött be, de a B osztály csak azoknak az osztályoknak látható, amelyeket az Extension ClassLoader töltött be.

Továbbá, ha megpróbálja betölteni ezeket az osztályokat a Bootstrap ClassLoader használatával, látni fogja a java.lang.ClassNotFoundException . kivétel.

Rendben, most, hogy ismeri a ClassLoaders típusait és a mögöttes alapelveket, nézzünk meg néhány fontos módszerttól java.lang.ClassLoader osztály.

A ClassLoader módszerei a Java-ban

Kevés nélkülözhetetlen a következő osztályok:

loadClass (Karakterlánc neve, logikai felbontás)

Ez a módszer a ClassLoader belépési pontja, és a JVM által hivatkozott osztály betöltésére szolgál. A. Nevét veszi fel paraméterként. A JVM meghívja a loadClass () metódust az osztály hivatkozások feloldására a logikai érték igazra állításával. Csak akkor, ha meg kell határoznunk, hogy létezik-e az osztály, vagy sem, a logikai paramétert hamisra állítjuk.

Nyilatkozat:

public Class loadClass (karakterlánc neve, logikai felbontás) dobja a ClassNotFoundException {

defineClass ()

A bájtömb definiálására használt végső módszer egy osztály példányaként. Ha az osztály érvénytelen, akkor dob egy ClassFormatError-t.

Nyilatkozat:

védett végső Class defineClass (karakterlánc neve, bájt [] b, int ki, int len) dobja a ClassFormatError

findClass (karakterlánc neve)

A findClass metódus a megadott osztály megkeresésére szolgál. Tehát csak megkeresi az osztályt, amelynek paramétere egy teljesen minősített név, de nem tölti be az osztályt. A loadClass () metódus akkor hívja meg ezt a módszert, ha a szülő ClassLoader nem találja meg a kért osztályt. Továbbá, ha a ClassLoader egyik szülője sem találja meg az osztályt, akkor az alapértelmezett megvalósítás a ClassNotFoundException.

Nyilatkozat:

védett Class findClass (karakterlánc neve) dobja a ClassNotFoundException parancsot

Class.forName (Karakterlánc neve, logikai inicializálás, ClassLoader betöltő)

Ezt a módszert használják az osztály betöltésére és inicializálására. Lehetőséget ad a ClassLoader bármelyikének kiválasztására és a ClassLoader paraméter NULL értékének beillesztésére, majd automatikusan a Bootstrap ClassLoader használatára..

Nyilatkozat:

public static Class forName (karakterlánc neve, logikai inicializálás, ClassLoader betöltő) dobja a ClassNotFoundException

getParent ()

A getParent metódussal a szülő ClassLoader küldhető vissza delegálásra.

Nyilatkozat:

nyilvános végleges ClassLoader getParent ()

getResource ()

Ahogy a neve is sugallja, a getResource () metódus megpróbálta megtalálni a megadott névvel rendelkező erőforrást. Kezdetben a kérelmet a szülő ClassLoader-re ruházza át az erőforráshoz. Ha a szülő null, akkor a JVM-be épített ClassLoader elérési útját keresi. Ha ez nem sikerül, akkor a módszer meghívja a findResource (String) -et az erőforrás megkeresésére, ahol az erőforrás neve bemenetként van megadva, amely lehet abszolút vagy relatív osztályút. Ezután visszaad egy URL-objektumot az erőforrás olvasására, vagy null értéket ad vissza, ha az erőforrás nem rendelkezik megfelelő jogosultságokkal az erőforrás visszaadásához, vagy ha nem található.

Nyilatkozat:

nyilvános URL getResource (karakterlánc neve)

Ezután a Java ClassLoaderről szóló cikkünkben értsük meg az Custom ClassLoader alkalmazást.

Custom ClassLoader Java-ban

A beépített ClassLoaders gondoskodik azokról az esetekről, amikor a fájlok már megtalálhatók a fájlrendszerben, de ha az osztályokat ki akarja tölteni a helyi merevlemezről, akkor használnia kell az egyedi ClassLoader alkalmazásokat.

Hozzon létre Custom ClassLoader alkalmazást

Egyéni ClassLoader létrehozásához ki kell terjesztenie a ClassLoader osztály és felülírja a findClass () módszer:

Példa: Hozzunk létre egy egyedi ClassLoader-t, amely kiterjeszti az alapértelmezett ClassLoader-t és betölt egy bájt tömböt a megadott fájlból. Lásd az alábbi kódot.

csomag edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream nyilvános osztály Minta kiterjeszti a ClassLoader {@Override public Class findClass (karakterlánc mintanév) dobja ClassNotFoundException {byte [] b = customLoad (samplename) return defineClass (samplename, b, 0, b.length)} privát bájt [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', separatorChar) + '.class') byte [] puffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} puffer = bStream.toByteArray () visszatérő puffer}}

Ezzel véget értünk a Java-ban található ClassLoader-ről. Remélem, megértette, hogy mi is a Java ClassLoaders, annak módszerei, a ClassLoaders különféle típusai stb.

Ha megtalálta ezt a cikket a „ClassLoader Java-ban”, nézze meg a az Edureka, egy megbízható online tanulási vállalat, amelynek több mint 250 000 elégedett tanulóval rendelkező hálózata elterjedt az egész világon. Azért vagyunk itt, hogy segítséget nyújtsunk utazásának minden lépésében, hogy a java interjú kérdései mellé válva egy tananyagot állítsunk össze, amelyet azoknak a hallgatóknak és szakembereknek tervezünk, akik szeretnének egy Jáva Fejlesztő.

Van egy kérdésünk? Kérjük, említse meg a „ClassLoader Java-ban” megjegyzés szakaszában ' és a lehető leghamarabb kapcsolatba lépünk Önnel.