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:
- Mi az a ClassLoader?
- A ClassLoader típusai
- A ClassLoader alapelvei
- A ClassLoader módszerei
- 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:
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)
- defineClass ()
- findClass (karakterlánc neve)
- Class.forName (Karakterlánc neve, logikai inicializálás, ClassLoader betöltő)
- getParent ()
- getResource ()
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.