Quin és el paper d'un ClassLoader a Java?



Aquest article és una guia completa sobre com funciona ClassLoader a Java. Es discuteixen els tipus, principis i mètodes de ClassLoader a Java.

Mentre treballem a Java, sovint fem servir un gran nombre de classes. Aquestes classes Java no es carreguen alhora a la memòria, sinó que es carreguen quan una aplicació ho requereix. Aquí és on apareixen Java ClassLoaders. Així doncs, en aquest article, parlaré de com utilitzar ClassLoader a Java juntament amb exemples.

En aquest article es tractaran els temes següents:





  1. Què és ClassLoader?
  2. Tipus de ClassLoader
  3. Principis de ClassLoader
  4. Mètodes de ClassLoader
  5. ClassLoader personalitzat

Comencem!

Què és ClassLoader a Java?

ClassLoader a Java és cridat per Java Runtime Environment per carregar dinàmicament les classes sempre que ho requereixi l'aplicació a Màquina virtual Java . Atès que ClassLoaders forma part de l'entorn d'execució de Java, la màquina virtual de Java no tindrà cap idea sobre els fitxers i sistemes de fitxers subjacents.



Ara, entenem els diferents tipus de ClassLoaders integrats a Java.

Tipus de ClassLoader a Java

Els diferents tipus de ClassLoaders a Java són els següents:

Analitzem cadascun d'ells un per un.



Extensió ClassLoader

Com el seu nom indica, Extension ClassLoader carrega les extensions de les classes bàsiques de Java des de JDK Biblioteca d’extensions. És un fill del Bootstrap ClassLoader i carrega les extensions del directori JRE / lib / text o de qualsevol altre directori especificat a la propietat del sistema java.ext.dirs.

Aplicació o sistema ClassLoader

L'aplicació o System ClassLoader és un element secundari de l'extensió ClassLoader. Aquest tipus de ClassLoader carrega totes les classes de nivell d'aplicació que es troben a l'opció de línia d'ordres -cp o a la variable d'entorn CLASSPATH.

tutorial mysql per a principiants amb exemples

Bootstrap ClassLoader

Com tots ho sabem Classes de Java són carregats per una instància de java.lang.ClassLoade. Però, ja que ClassLoaders són classes, el Bootstrap ClassLoader és responsable de carregar les classes internes de JDK. BootStrap ClassLoader és un codi de màquina que inicia l'operació quan la JVM la crida i carrega les classes des de rt.jar. Per tant, podeu entendre que el Bootstrap ClassLoader serveix no té cap ClassLoader pare i, per tant, es coneix com Primordial ClassLoader.

Nota: La prioritat de Bootstrap és superior a Extension i la prioritat que es dóna a Extension ClassLoader és superior a Application ClassLoader. Consulteu la imatge següent:

Tipus de ClassLoader - ClassLoader a Java - Edureka

A continuació, en aquest article, entenem els principis sobre els quals funciona ClassLoader.

Principis de ClassLoader a Java

El conjunt de regles basades en les quals funciona el Java ClassLoader són els tres principis següents:

Entenguem cadascun d’ells.

Propietat de singularitat

Aquesta propietat garanteix que no es repeteixin classes i totes les classes siguin úniques. La propietat d'unicitat també garanteix que ClassLoader pare carregui les classes i que no el carregui ClassLoader fill. En un escenari en què el ClassLoader pare no pot trobar la classe, la instància actual intentarà fer-la per si mateixa.

Model de delegació

ClassLoader en Java funciona basat en el conjunt d’operacions donades pel model de delegació. Per tant, sempre que es generi una sol·licitud per trobar una classe o un recurs, una instància ClassLoader delegarà la cerca de la classe o del recurs al ClassLoader pare.

El conjunt d’operacions basades en les quals funciona ClassLoader són les següents:

  • La màquina virtual Java comprova si la classe es carrega o no, sempre que es troba amb una classe.
  • En el cas que es carregui la classe JVM continua amb l'execució de la classe, però en un escenari on la classe no es carrega, llavorsJVM demana al subsistema Java ClassLoader que carregui aquesta classe en particular. Després d'això, el subsistema ClassLoader dóna control a Application ClassLoader.
  • A continuació, l'aplicació ClassLoader delega la sol·licitud a l'extensió ClassLoader, que posteriorment passa la sol·licitud al Bootstrap ClassLoader.
  • Ara, el Bootstrap ClassLoader cerca al fitxerBootstrap classpath per comprovar si la classe està disponible o no. Si la classe està disponible, es carrega, en cas contrari, la sol·licitud es torna a passar a l'extensió ClassLoader.
  • L'extensió ClassLoader comprova la classe a la ruta de classificació de l'extensió.Si la classe està disponible, es carrega, en cas contrari, la sol·licitud es torna a passar a l'aplicació ClassLoader.
  • Finalment, l'aplicació ClassLoader cerca la classe a l'aplicació classpath.Si la classe està disponible, es carrega, altrament veureu una excepció de ClassNotFoundException.

Consulteu la imatge següent.

llançament contra llançaments vs llançable a Java

Principi de visibilitat

Segons aquest principi, les classes infantils són visibles per a les classes carregades pels seus ClassLoaders pares, però el contrari no és cert. Per tant, les classes carregades per Application ClassLoader tenen visibilitat a les classes carregades per l'extensió i Bootstrap ClassLoader.

Per exemple, si tenim dues classes: A & B, suposem que l'aplicació ClassLoader carrega la classe A i que la classe B la carrega l'extensions ClassLoader. Aquí, les classes A i B són visibles per a totes aquelles classes carregades per l’aplicació ClassLoader, però la classe B només és visible per a aquelles classes carregades per l’extensió ClassLoader.

A més, si proveu de carregar aquestes classes mitjançant Bootstrap ClassLoader, veureu el fitxer java.lang.ClassNotFoundException . excepció.

Molt bé, ara que ja coneixeu els tipus de ClassLoaders i els principis que hi ha darrere, analitzem alguns mètodes importantsdes del java.lang.ClassLoader classe.

Mètodes de ClassLoader a Java

Pocs imprescindibles de ClassLoader són els següents:

loadClass (nom de la cadena, resolució booleana)

Aquest mètode és el punt d'entrada del ClassLoader i s'utilitza per carregar la classe a què fa referència la JVM. Pren el nom de com a paràmetre. La JVM invoca el mètode loadClass () per resoldre les referències de classe establint el valor booleà a true. Només si hem de determinar si la classe existeix o no, el paràmetre booleà s'estableix en false.

Declaració:

public Class loadClass (nom de la cadena, resolució booleana) genera ClassNotFoundException {

defineClass ()

Un mètode final utilitzat per definir una matriu de bytes com una instància d’una classe. En cas que la classe no sigui vàlida, llança un ClassFormatError.

Declaració:

classe final protegida defineClass (nom de la cadena, byte [] b, int off, int len) llança ClassFormatError

findClass (nom de la cadena)

El mètode findClass s’utilitza per trobar la classe especificada. Per tant, només troba la classe amb un nom complet com a paràmetre, però no carrega la classe. El mètode loadClass () invoca aquest mètode si ClassLoader pare no pot trobar la classe sol·licitada. A més, si cap pare del ClassLoader no troba la classe, la implementació per defecte llança a ClassNotFoundException.

Declaració:

La classe protegida findClass (nom de la cadena) llança ClassNotFoundException

Class.forName (nom de la cadena, inicialització booleana, carregador ClassLoader)

Aquest mètode s’utilitza per carregar i inicialitzar la classe. Ofereix una opció per triar qualsevol dels ClassLoaders i si el paràmetre ClassLoader és NULL, s'utilitza automàticament el Bootstrap ClassLoader.

Declaració:

public static Class forName (nom de cadena, inicialització booleana, carregador ClassLoader) llança ClassNotFoundException

getParent ()

El mètode getParent s’utilitza per retornar el ClassLoader pare per delegació.

Declaració:

final públic ClassLoader getParent ()

getResource ()

Com el seu nom indica, el mètode getResource () va intentar trobar un recurs amb el nom donat. Inicialment delegarà la sol·licitud al ClassLoader pare del recurs. En cas que el pare és nul, es busca el camí de ClassLoader integrat a la JVM. Ara, si falla, el mètode invocarà el findResource (String) per trobar el recurs, on el nom del recurs s'especifica com a entrada que pot ser la ruta de classe absoluta o relativa. A continuació, retorna un objecte URL per llegir el recurs o torna un valor nul si el recurs no té privilegis adequats per retornar el recurs o no es troba.

Declaració:

URL pública getResource (nom de la cadena)

A continuació, en aquest article sobre ClassLoader a Java, entenem el ClassLoader personalitzat.

ClassLoader personalitzat a Java

Els ClassLoaders integrats s’encarregaran de la majoria dels casos en què els fitxers ja es troben al sistema de fitxers, però si voleu carregar les classes del disc dur local, haureu de fer servir ClassLoaders personalitzats.

Creeu ClassLoader personalitzat

Per crear un ClassLoader personalitzat, heu d’estendre el fitxer ClassLoader classe i anul·leu el findClass () mètode:

Exemple: creem un ClassLoader personalitzat que amplia el ClassLoader per defecte i carrega una matriu de bytes des del fitxer especificat. Consulteu el codi següent.

paquet edureka importació java.io.ByteArrayOutputStream importació java.io.File importació java.io.IOException importació java.io.InputStream classe pública Sample estén ClassLoader {@Override public Class findClass (String samplename) llança ClassNotFoundException {byte [] b = customLo (samplename) return defineClass (samplename, b, 0, b.length)} byte privat [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () buffer de retorn}}

Amb això, arribem al final d’aquest article sobre ClassLoader a Java. Espero que hagueu entès què són ClassLoaders a Java, els seus mètodes, els diferents tipus de ClassLoaders, etc.

Si heu trobat aquest article sobre 'ClassLoader a Java', consulteu el per Edureka, una empresa d'aprenentatge en línia de confiança amb una xarxa de més de 250.000 estudiants satisfets repartits per tot el món. Estem aquí per ajudar-vos en cada pas del vostre viatge, per convertir-vos en una pregunta a part d’aquestes entrevistes java, oferim un pla d’estudis dissenyat per a estudiants i professionals que vulguin ser Java Desenvolupador.

què és una classe anònima a Java

Tens alguna pregunta? Esmenteu-lo a la secció de comentaris d’aquest “ClassLoader a Java ' i ens posarem en contacte amb vostè el més aviat possible.