JavaRush /Блоги Java /Random-TG /Чӣ гуна дарсҳо ба JVM бор карда мешаванд
Aleksandr Zimin
Сатҳи
Санкт-Петербург

Чӣ гуна дарсҳо ба JVM бор карда мешаванд

Дар гурӯҳ нашр шудааст
Пас аз ба итмом расидани қисми душвортарини кори барномасоз ва навиштани замимаи "Hello World 2.0" танҳо ҷамъ кардани маҷмӯаи тақсимот ва интиқол додани он ба фармоишгар ё ҳадди аққал ба хидмати санҷишӣ боқӣ мемонад. Дар тақсимот, ҳама чиз бояд тавре бошад, ва вақте ки мо барномаи худро оғоз мекунем, мошини виртуалии Java ба саҳна меояд. Пӯшида нест, ки мошини виртуалӣ фармонҳои дар файлҳои синфӣ дар шакли byte-code пешниҳодшударо мехонад ва онҳоро ҳамчун дастур ба протсессор тарҷума мекунад. Ман пешниҳод мекунам, ки каме дар бораи схемаи ворид шудани bytecode ба мошини виртуалӣ фаҳмем.

Боркунаки синф

Он барои таъмин намудани bytecodeи тартибдодашуда ба JVM истифода мешавад, ки одатан дар файлҳои дорои васеъшавӣ нигоҳ дошта мешавад .class, аммо онро инчунин аз дигар манбаъҳо дастрас кардан мумкин аст, масалан, аз тариқи шабака зеркашӣ карда мешавад ё тавассути худи барнома тавлид мешавад. Чӣ гуна дарсҳо дар JVM бор карда мешаванд - 1Тибқи мушаххасоти Java SE, барои ба даст овардани code дар JVM, шумо бояд се қадамро иҷро кунед:
  • боркунии bytecode аз захираҳо ва эҷоди як мисоли синфClass

    ин ҷустуҷӯи синфи дархостшуда дар байни онҳое, ки қаблан бор карда шудаанд, гирифтани bytecode барои боркунӣ ва санҷиши дурустии он, эҷоди намунаи синф Class(барои кор бо он дар вақти корӣ) ва боркунии синфҳои волидайнро дар бар мегирад. Агар синфҳои волидайн ва интерфейсҳо бор карда нашуда бошанд, он гоҳ синфи мавриди назар бор карда нашудааст.

  • ҳатмӣ (ё пайванд)

    Тибқи мушаххасот, ин марҳила ба се марҳилаи дигар тақсим мешавад:

    • Санҷиш , дурустии bytecodeи гирифташуда тафтиш карда мешавад.
    • Омодагӣ , ҷудо кардани хотираи RAM барои майдонҳои статикӣ ва оғоз кардани онҳо бо арзишҳои пешфарз (дар ин ҳолат, оғозкунии возеҳ, агар мавҷуд бошад, аллакай дар марҳилаи оғозёбӣ ба амал меояд).
    • Резолюция , ҳалли пайвандҳои рамзии намудҳо, соҳаҳо ва усулҳо.
  • оғоз кардани an objectи қабулшуда

    дар ин ҷо, бар хилофи параграфҳои қаблӣ, ҳама чиз равшан аст, ки чӣ бояд кард. Албатта, фаҳмидани он ки ин чӣ гуна рӯй медиҳад, ҷолиб мебуд.

Ҳамаи ин қадамҳо бо риояи талаботи зерин иҷро карда мешаванд:
  • Пеш аз пайваст шудан, синф бояд пурра пур карда шавад.
  • Синф бояд пурра санҷида шавад ва пеш аз оғоз кардани он омода карда шавад.
  • Хатогиҳои ҳалли истинод ҳангоми иҷрои барнома рух медиҳанд, ҳатто агар онҳо дар марҳилаи пайвастшавӣ ошкор шуда бошанд.
Тавре ки шумо медонед, Java боркунии танбал (ё танбал) -ро амалӣ мекунад. Ин маънои онро дорад, ки боркунии синфҳои майдонҳои истинод аз синфи боршуда то он даме, ки барнома бо истиноди возеҳ ба онҳо дучор нашавад, иҷро намешавад. Ба ибораи дигар, ҳалли истинодҳои рамзӣ ихтиёрӣ аст ва бо нобаёнӣ рух намедиҳад. Аммо, татбиқи JVM инчунин метавонад боркунии синфи энергетикиро истифода барад, яъне. тамоми пайвандакҳои рамзӣ бояд фавран ба назар гирифта шаванд. Маҳз дар ин маврид талаботи охирин татбиқ мешавад. Инчунин бояд қайд кард, ки ҳалли пайвандҳои рамзӣ ба ягон марҳилаи боркунии синфҳо вобаста нест. Умуман, ҳар яке аз ин марҳилаҳо омӯзиши хубро фароҳам меоранд; биёед кӯшиш кунем, ки марҳилаи аввалро фаҳмем, яъне боркунии byte code.

Намудҳои боркунакҳои Java

Дар Java се боркунаки стандартӣ мавҷуд аст, ки ҳар кадоми онҳо синфро аз макони мушаххас бор мекунанд:
  1. Bootstrap як боркунаки асосӣ аст, ки онро Primordial ClassLoader низ меноманд.

    дарсҳои стандартии JDK аз бойгонии rt.jar бор мекунад

  2. Extension ClassLoader – боркунаки васеъшавӣ.

    синфҳои васеъкуниро, ки ба таври нобаёнӣ дар директорияи jre/lib/ext ҷойгиранд, бор мекунад, аммо онҳоро бо моликияти системаи java.ext.dirs муқаррар кардан мумкин аст.

  3. System ClassLoader - боркунаки система.

    синфҳои барномаро, ки дар тағирёбандаи муҳити CLASSPATH муайян шудаанд, бор мекунад

Java иерархияи боркунакҳои синфро истифода мебарад, ки дар он реша, албатта, асосист. Баъдан боркунаки васеъкунӣ ва сипас боркунаки система меояд. Табиист, ки ҳар як боркунак нишондиҳандаеро ба волидайн нигоҳ медорад, то дар сурати худаш ин корро карда натавонад, боркуниро ба он вогузор кунад.

Синфи абстрактии ClassLoader

Ҳар як боркунак, ба истиснои боркунаки асосӣ, насли синфи абстрактӣ мебошад java.lang.ClassLoader. Масалан, татбиқи боркунаки васеъкунӣ синф аст sun.misc.Launcher$ExtClassLoaderва боркунаки система sun.misc.Launcher$AppClassLoader. Боркунаки асосӣ аслӣ аст ва татбиқи он ба JVM дохил карда шудааст. Ҳар як синфе, ки васеъ мешавад, java.lang.ClassLoaderметавонад роҳи худро барои боркунии синфҳо бо blackjack ва ҳамонҳоро таъмин кунад. Барои ин усулҳои мувофиқро аз нав муайян кардан лозим аст, ки дар айни замон ман метавонам онҳоро танҳо сатҳӣ баррасӣ кунам, зеро Ман ин масъаларо ба таври муфассал нафаҳмидам. Инҳоянд:
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)яке аз чанд усулҳои ҷамъиятӣ, ки нуқтаи вуруд барои боркунии дарсҳо аст,. loadClass(String name, boolean resolve)Татбиқи он ба даъват кардани усули дигари муҳофизатшуда , ки бояд бекор карда шавад, поён меёбад . Агар шумо ба Javadoc-и ин усули муҳофизатшуда назар кунед, шумо метавонед як чизи зеринро фаҳмед: ду параметр ҳамчун вуруд дода мешаванд. Яке номи дуии синф (ё номи синфи пурраи тахассусӣ) аст, ки бояд бор карда шавад. Номи синф бо рӯйхати ҳамаи бастаҳо муайян карда мешавад. Параметри дуюм парчамест, ки муайян мекунад, ки оё ҳалли истинодҳои рамзӣ лозим аст. Бо нобаёнӣ он false аст , яъне маънои боркунии синфи танбал истифода мешавад. Ғайр аз он, тибқи ҳуҷҷатҳо, ҳангоми татбиқи пешфарзии усул занг зада мешавад findLoadedClass(String name), ки он тафтиш мекунад, ки оё синф қаблан бор карда шудааст ва агар ин тавр бошад, истинод ба ин синфро бармегардонад. Дар акси ҳол, усули боркунии синф аз боркунаки волидайн даъват карда мешавад. Агар ҳеҷ яке аз боркунакҳо синфи пурборро пайдо карда натавонанд, ҳар яке аз онҳо бо тартиби баръакс, кӯшиш мекунанд, ки он синфро пайдо ва бор кунанд ва findClass(String name). Дар ин бора дар боби «Схемаи боркунии синф» муфассалтар сухан меравад. Ва ниҳоят, дар ниҳоят, аммо на камтар аз он, пас аз бор кардани синф, вобаста ба парчами ҳал қарор дода мешавад, ки оё дарсҳо тавассути истинодҳои рамзӣ бор карда шаванд. Мисоли равшан ин аст, ки марҳилаи ҳалли мушкилотро дар марҳилаи боркунии синф даъват кардан мумкин аст. Мутаносибан, бо васеъ кардани синф ClassLoaderва барҳам додани усулҳои он, боркунаки фармоишӣ метавонад мантиқи худро барои интиқоли bytecode ба мошини виртуалӣ амалӣ кунад. Java инчунин консепсияи боркунаки синфи "ҷорӣ" -ро дастгирӣ мекунад. Боркунаки ҷорӣ ҳамонест, ки синфи иҷрошавандаро бор кардааст. Ҳар як синф медонад, ки бо кадом боркунак бор карда шудааст ва шумо метавонед ин маълумотро тавассути занг задан ба он дастрас кунед String.class.getClassLoader(). Барои ҳама синфҳои барнома, боркунаки "ҷорӣ" одатан як система аст.

Се принсипи боркунии синф

  • Хайати вакилон

    Дархост барои бор кардани синф ба боркунандаи волидайн интиқол дода мешавад ва кӯшиши боркунии худи синф танҳо дар сурате анҷом дода мешавад, ки агар боркунандаи волидайн синфро пайдо ва бор карда натавонист. Ин равиш ба шумо имкон медиҳад, ки дарсҳоро бо боркунак, ки то ҳадди имкон ба базавӣ наздик бошад, бор кунед. Ин ба ҳадди аксар дидани синф ноил мешавад. Ҳар як боркунак сабти синфҳои аз ҷониби худ боршударо нигоҳ медорад ва онҳоро дар кэши худ ҷойгир мекунад. Маҷмӯи ин синфҳо миқёс номида мешавад.

  • Намоиш

    Боркунак танҳо дарсҳои "худ" ва синфҳои "волид"-ро мебинад ва дар бораи дарсҳое, ки "фарзанд"-аш бор кардааст, тасаввуроте надорад.

  • Нотакрорӣ

    Синфро танҳо як маротиба бор кардан мумкин аст. Механизми намояндагӣ боварӣ ҳосил мекунад, ки боркунандае, ки боркунии синфро оғоз мекунад, синферо, ки қаблан ба JVM бор карда шуда буд, аз ҳад зиёд бор намекунад.

Ҳамин тариқ, ҳангоми навиштани пурборкунандаи худ, таҳиякунанда бояд ин се принсипро роҳнамоӣ кунад.

Схемаи боркунии синф

Вақте ки занг барои боркунии синф рух медиҳад, ин синф дар кэши синфҳои аллакай боркардаи боркунандаи ҷорӣ ҷустуҷӯ карда мешавад. Агар синфи дилхоҳ қаблан бор карда нашуда бошад, принсипи ваколат назоратро ба боркунаки волидайн интиқол медиҳад, ки дар зинаниз як зина болотар ҷойгир аст. Боркунаки волидайн инчунин кӯшиш мекунад, ки синфи дилхоҳро дар кэши худ пайдо кунад. Агар синф аллакай бор карда шуда бошад ва боркунанда ҷойгиршавии онро донад, an objectи Classон синф баргардонида мешавад. Дар акси ҳол, ҷустуҷӯ то он даме, ки он ба пурборкунандаи асосӣ расад, идома меёбад. Агар боркунаки асосӣ дар бораи синфи зарурӣ маълумот надошта бошад (яъне он ҳанӯз бор карда нашудааст), bytecodeи ин синф дар ҷойгиршавии синфҳое, ки боркунаки додашуда дар бораи онҳо медонад, ҷустуҷӯ карда мешавад ва агар синф наметавонад бор карда шавад, назорат ба боркунаки кӯдакона бармегардад, ки кӯшиш мекунад аз манбаъҳои ба ӯ маълум бор кунад. Тавре ки дар боло зикр гардид, ҷойгиршавии синфҳо барои боркунаки асосӣ китобхонаи rt.jar, барои боркунаки васеъкунӣ - директория бо васеъшавии jre/lib/ext, барои система як - CLASSPATH, барои корбар он метавонад чизи дигар бошад. . Ҳамин тариқ, пешрафти синфҳои боркунӣ ба самти муқобил меравад - аз боркунаки реша ба ҳолати ҷорӣ. Вақте ки byte-codeи синф пайдо мешавад, синф ба JVM бор карда мешавад ва намунаи навъи он гирифта мешавад Class. Тавре ки шумо ба осонӣ мебинед, схемаи боркунии тавсифшуда ба татбиқи дар боло зикршуда монанд аст loadClass(String name). Дар зер шумо ин диаграммаро дар диаграмма мебинед.
Чӣ гуна дарсҳо дар JVM бор карда мешаванд - 2

Хамчун хулоса

Дар қадамҳои аввалини омӯзиши забон, барои фаҳмидани чигунагии дарсҳо дар Java зарурати махсус вуҷуд надорад, аммо донистани ин принсипҳои асосӣ ба шумо кӯмак мекунад, ки ҳангоми дучор шудан бо хатогиҳо ба монанди ClassNotFoundExceptionё NoClassDefFoundError. Хуб, ё ҳадди аққал тақрибан дарк кунед, ки решаи мушкилот дар чист. Ҳамин тариқ, истисно ClassNotFoundExceptionвақте рух медиҳад, ки синф ҳангоми иҷрои барнома ба таври динамикӣ бор карда мешавад, вақте ки боркунакҳо синфи заруриро на дар кэш ё дар роҳи синф пайдо карда наметавонанд. Аммо хатогӣ NoClassDefFoundErrorмуҳимтар аст ва вақте рух медиҳад, ки синфи зарурӣ ҳангоми тартиб додан дастрас буд, аммо ҳангоми иҷрои барнома намоён набуд. Ин метавонад рӯй диҳад, агар барнома дохил кардани китобхонаи истифодашударо фаромӯш карда бошад. Хуб, худи далели фаҳмидани принсипҳои сохтори асбобе, ки шумо дар кори худ истифода мебаред (на ҳатман ғарқ кардани дақиқ ва муфассал дар умқи он) ба фаҳмиши равандҳое, ки дар дохor ин механизм ба амал меоянд, равшанӣ мебахшад. гардиш, боиси дилпурона истифода бурдани ин восита мегардад.

Сарчашмаҳо

Чӣ тавр ClassLoader дар Java кор мекунад Умуман як манбаи хеле муфид бо муаррифии дастраси иттилоот. Боркунии дарсҳо, ClassLoader Мақолаи хеле тӯлонӣ, аммо бо таваҷҷӯҳ ба он, ки чӣ гуна татбиқи боркунаки шахсии худро бо ҳаминҳо анҷом диҳед. ClassLoader: боркунии динамикии дарсҳо Мутаассифона, ин манбаъ ҳоло дастрас нест, аммо дар он ҷо ман диаграммаи фаҳмотаринро бо схемаи боркунии синф ёфтам, аз ин рӯ ман наметавонам онро илова кунам. Мушаххасоти Java SE: Боби 5. Боркунӣ, пайвастшавӣ ва оғозёбӣ
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION