Synp ýükleýjisi
JVM-e düzülen bytekod bilen üpjün etmek üçin ulanylýar, adatça giňeltme bilen faýllarda saklanýar.class
, ýöne beýleki çeşmelerden hem alyp bolýar, mysal üçin, tor arkaly göçürip alnan ýa-da programmanyň özi. Java SE spesifikasiýasyna görä, JVM-de kod işlemek üçin üç ädim ýerine ýetirmeli:
-
çeşmelerden kod koduny ýüklemek we synpyň mysalyny döretmek
Class
bu ozal ýüklenenleriň arasynda talap edilýän synpy gözlemegi, ýüklemek we dogrulygyny barlamak üçin kod koduny almak, synpyň mysalyny döretmek
Class
(iş wagty bilen işlemek üçin) we ene-atalar synplaryny ýüklemek ýaly maglumatlary öz içine alýar. Ene-atalar synplary we interfeýsler ýüklenmedik bolsa, sorag edilýän synp ýüklenmedik hasaplanýar. -
baglaýjy (ýa-da baglanyşyk)
Spesifikasiýa laýyklykda bu etap ýene üç basgançaga bölünýär:
- Barlamak , alnan kod kodunyň dogrulygy barlanýar.
- Statiki meýdanlar üçin RAM taýýarlamak , deslapky bahalar bilen başlamak (bu ýagdaýda aç-açan başlangyç, eger başlangyç bar bolsa, başlangyç etapda bolup geçýär).
- Rezolýusiýa , görnüşleriň, meýdanlaryň we usullaryň simwoliki baglanyşyklarynyň çözgüdi.
-
alnan obýekti başlatmak
bu ýerde, öňki abzaslardan tapawutlylykda, nämeleriň bolmalydygy düşnükli ýaly. Elbetde munuň nähili bolýandygyna düşünmek gyzykly bolar.
- Baglanmazdan ozal synp doly ýüklenmeli.
- Bir synp doly synagdan geçirilmeli we başlamazdan ozal taýýarlanmaly.
- Baglanyş çözgüdi ýalňyşlyklary, baglanyşyk tapgyrynda ýüze çykarylsa-da, programma ýerine ýetirilende ýüze çykýar.
Java ýükleýjileriň görnüşleri
Java-da üç sany standart ýükleýji bar, olaryň hersi belli bir ýerden synp ýükleýär:-
“Bootstrap” esasy ýükleýjidir, oňa “Primordial ClassLoader” hem diýilýär.
rt.jar arhiwinden standart JDK synplaryny ýükleýär
-
“Extension ClassLoader” - giňeldiji ýükleýji.
jre / lib / ext katalogynda ýerleşýän, ýöne java.ext.dirs ulgam eýeçiligi tarapyndan kesgitlenip bilýän giňeltme synplaryny ýükleýär.
-
System ClassLoader - ulgam ýükleýjisi.
CLASSPATH gurşaw üýtgeýjisinde kesgitlenen programma sapaklaryny ýükleýär
Abstrakt synp ClassLoader
Her bir ýükleýji, esasydan başga, abstrakt synpyň neslidirjava.lang.ClassLoader
. Mysal üçin, giňeltme ýükleýjiniň ýerine ýetirilmegi synp sun.misc.Launcher$ExtClassLoader
, ulgam ýükleýjisi sun.misc.Launcher$AppClassLoader
. Esasy ýükleýji ýerli we ony durmuşa geçirmek JVM-e girýär. Giňeldilen islendik synp, java.lang.ClassLoader
“blackjack” we şuňa meňzeşler bilen sapaklary ýüklemegiň öz usulyny üpjün edip biler. Munuň üçin häzirki wagtda diňe ýüzleý seredip biljek degişli usullary täzeden kesgitlemeli, sebäbi Bu meselä jikme-jik düşünmedim. Ine:
package java.lang;
public abstract class ClassLoader {
public Class<?> loadClass(String name);
protected Class<?> loadClass(String name, boolean resolve);
protected final Class<?> findLoadedClass(String name);
public final ClassLoader getParent();
protected Class<?> findClass(String name);
protected final void resolveClass(Class<?> c);
}
loadClass(String name)
sapaklary ýüklemek üçin giriş nokady bolan az sanly köpçülikleýin usullardan biri. Ony durmuşa geçirmek, başga bir goralýan usuly çagyrmak üçin gaýnadylýar loadClass(String name, boolean resolve)
. Bu goralýan usulyň Javadoc-a seretseňiz, aşakdaky ýaly bir zada düşünip bilersiňiz: giriş hökmünde iki parametr üpjün edilýär. Biri ýüklenmeli synpyň ikilik ady (ýa-da doly hünärli synp ady). Synpyň ady ähli paketleriň sanawy bilen görkezilýär. Ikinji parametr, simwoliki baglanyşyk çözgüdiniň zerurdygyny kesgitleýän baýdakdyr. Gaýybana, bu ýalňyş , ýagny ýalta synp ýüklemesi ulanylýar. Mundan başga-da, resminamalara laýyklykda, usulyň deslapky ýerine ýetirilişinde findLoadedClass(String name)
synpyň eýýäm ýüklenendigini ýa-da ýokdugyny barlaýan we eger şeýle bolsa, bu synpa salgylanma berýän jaň edilýär. Otherwiseogsam, esasy ýükleýjiniň synp ýükleme usuly diýler. Eger ýükleýänleriň hiç biri ýüklenen synpy tapyp bilmese, olaryň her biri tersine tertipde şol synpy tapmaga we ýüklemäge synanyşar findClass(String name)
. Bu barada “Klassiki ýükleme shemasy” bölüminde has jikme-jik ara alnyp maslahatlaşylar. Iň soňunda bolsa, iň soňkusy, iň azyndan, synp ýüklenenden soň, çözgüt baýdagyna baglylykda , simwoliki baglanyşyklar arkaly sapaklary ýüklemek ýa-da ýüklemek karary berler. Muňa aýdyň mysal, rezolýusiýa tapgyryny synp ýükleme döwründe çagyryp bolar. Şoňa görä-de, synpy giňeltmek ClassLoader
we usullaryna aşa baha bermek bilen, ýörite ýükleýji, bytekody wirtual maşyna ýetirmek üçin öz logikasyny durmuşa geçirip biler. Java, şeýle hem "häzirki" synp ýükleýji düşünjesini goldaýar. Häzirki ýükleýji, häzirki ýerine ýetirilýän synpy ýükleýän. Her synp haýsy ýükleýjiniň ýüklenendigini bilýär we bu maglumatlary çagyryp alyp bilersiňiz String.class.getClassLoader()
. Applicationhli amaly synplar üçin "häzirki" ýükleýji adatça ulgamdyr.
Synp ýüklemegiň üç ýörelgesi
-
Delegasiýa
Synpy ýüklemek haýyşy ene-atanyň ýükleýjisine geçirilýär we synpy ýüklemek synanyşygy diňe ene-atanyň synpyny tapyp we ýükläp bilmedik ýagdaýynda edilýär. Bu çemeleşme, sapaklara mümkin boldugyça ýakyn bolan ýükleýji bilen sapaklary ýüklemäge mümkinçilik berýär. Bu synpyň iň ýokary görünmegine ýetýär. Her bir ýükleýji, keşde ýerleşdirilen sapaklaryň ýazgysyny ýöredýär. Bu synplaryň toplumyna masştab diýilýär.
-
Görünmek
Erükleýji diňe “onuň” synplaryny we “ene-atanyň” synplaryny görýär we “çagasy” tarapyndan ýüklenen sapaklar hakda hiç hili düşünje ýok.
-
Özboluşlylyk
Bir synpy diňe bir gezek ýükläp bolýar. Delegasiýa mehanizmi, synp ýüklemesini başlaýan ýükleýjiniň ozal JVM-e ýüklenen synpy artykmaç ýüklemeýändigine göz ýetirýär.
Klassiki ýükleme shemasy
Bir synp ýüklemek üçin çagyryş ýüze çykanda, bu synp häzirki ýükleýjiniň eýýäm ýüklenen synplarynyň keşinde gözlenýär. Öň islenýän synp ýüklenmedik bolsa, delegasiýa ýörelgesi dolandyryşy iýerarhiýada bir derejeden ýokary ýerleşýän esasy ýükleýjä geçirýär. Ene ýükleýji, keşde islenýän synpy tapmaga synanyşýar. Synp eýýäm ýüklenen bolsa we ýükleýji onuň ýerleşýän ýerini bilýän bolsa,Class
şol synpyň obýekti yzyna gaýtarylar. Notok bolsa, gözleg esasy ýükleýjä ýetýänçä dowam eder. Esasy ýükleýjiniň zerur synp barada maglumaty ýok bolsa (ýagny entek ýüklenmedi), bu synpyň kod kody berlen ýükleýjiniň bilýän synplarynyň ýerleşýän ýerinde gözlener we synp başaryp bilmese ýüklen, gözegçilik belli bolan çeşmelerden ýüklemäge synanyşjak çaga ýükleýjisine gaýdyp geler. Aboveokarda belläp geçişimiz ýaly, esasy ýükleýji üçin synplaryň ýerleşýän ýeri rt.jar kitaphanasy, giňeldiji ýükleýji üçin - jre / lib / ext giňeltmeleri bolan katalog, bir ulgam üçin - CLASSPATH, ulanyjy üçin başga zat bolup biler. . Şeýlelik bilen, ýüklemek synplarynyň ösüşi ters tarapa - kök ýükleýjiden häzirki tarapa geçýär. Synpyň kod kody tapylanda, synp JVM-e ýüklenýär we görnüşiň mysaly alynýar Class
. Ansatlyk bilen görşüňiz ýaly, beýan edilen ýükleme shemasy usulyň ýokardaky ýerine ýetirilişine meňzeýär loadClass(String name)
. Aşakda diagrammany görüp bilersiňiz.
Netije hökmünde
Dil öwrenmegiň ilkinji ädimlerinde sapaklaryň Java-da nädip ýüklenýändigine düşünmek zerurlygy ýok, ýöne bu esasy ýörelgeleri bilmekClassNotFoundException
ýa-da ýaly ýalňyşlyklar ýüze çykanda umytsyzlygyň öňüni almaga kömek eder NoClassDefFoundError
. Bolýar, ýa-da iň bolmanda meseläniň köküniň nämedigine düşüniň. ClassNotFoundException
Şeýlelik bilen, programma ýerine ýetirilende synp dinamiki ýüklenende, ýükleýjiler keşde ýa-da synp ýolunda zerur synpy tapyp bilmeýänlerinde kadadan çykma ýüze çykýar. Theöne ýalňyşlyk NoClassDefFoundError
has möhümdir we düzüliş wagtynda zerur synp elýeterli bolanda ýüze çykýar, ýöne programma ýerine ýetirilende görünmeýärdi. Programma ulanýan kitaphanasyny goşmagy ýatdan çykaran halatynda bolup biler. Işiňizde ulanýan guralyň gurluşynyň ýörelgelerine düşünmek hakykaty (onuň çuňlugyna aýdyň we jikme-jik çümdürilmegi hökman däl) bu mehanizmiň içinde bolup geçýän proseslere düşünmek üçin belli bir aýdyňlyk goşýar. öwrüp, bu guralyň ynamly ulanylmagyna getirýär.
GO TO FULL VERSION