Боркунаки синф
Он барои таъмин намудани bytecodeи тартибдодашуда ба JVM истифода мешавад, ки одатан дар файлҳои дорои васеъшавӣ нигоҳ дошта мешавад.class
, аммо онро инчунин аз дигар манбаъҳо дастрас кардан мумкин аст, масалан, аз тариқи шабака зеркашӣ карда мешавад ё тавассути худи барнома тавлид мешавад. Тибқи мушаххасоти Java SE, барои ба даст овардани code дар JVM, шумо бояд се қадамро иҷро кунед:
-
боркунии bytecode аз захираҳо ва эҷоди як мисоли синф
Class
ин ҷустуҷӯи синфи дархостшуда дар байни онҳое, ки қаблан бор карда шудаанд, гирифтани bytecode барои боркунӣ ва санҷиши дурустии он, эҷоди намунаи синф
Class
(барои кор бо он дар вақти корӣ) ва боркунии синфҳои волидайнро дар бар мегирад. Агар синфҳои волидайн ва интерфейсҳо бор карда нашуда бошанд, он гоҳ синфи мавриди назар бор карда нашудааст. -
ҳатмӣ (ё пайванд)
Тибқи мушаххасот, ин марҳила ба се марҳилаи дигар тақсим мешавад:
- Санҷиш , дурустии bytecodeи гирифташуда тафтиш карда мешавад.
- Омодагӣ , ҷудо кардани хотираи RAM барои майдонҳои статикӣ ва оғоз кардани онҳо бо арзишҳои пешфарз (дар ин ҳолат, оғозкунии возеҳ, агар мавҷуд бошад, аллакай дар марҳилаи оғозёбӣ ба амал меояд).
- Резолюция , ҳалли пайвандҳои рамзии намудҳо, соҳаҳо ва усулҳо.
-
оғоз кардани an objectи қабулшуда
дар ин ҷо, бар хилофи параграфҳои қаблӣ, ҳама чиз равшан аст, ки чӣ бояд кард. Албатта, фаҳмидани он ки ин чӣ гуна рӯй медиҳад, ҷолиб мебуд.
- Пеш аз пайваст шудан, синф бояд пурра пур карда шавад.
- Синф бояд пурра санҷида шавад ва пеш аз оғоз кардани он омода карда шавад.
- Хатогиҳои ҳалли истинод ҳангоми иҷрои барнома рух медиҳанд, ҳатто агар онҳо дар марҳилаи пайвастшавӣ ошкор шуда бошанд.
Намудҳои боркунакҳои Java
Дар Java се боркунаки стандартӣ мавҷуд аст, ки ҳар кадоми онҳо синфро аз макони мушаххас бор мекунанд:-
Bootstrap як боркунаки асосӣ аст, ки онро Primordial ClassLoader низ меноманд.
дарсҳои стандартии JDK аз бойгонии rt.jar бор мекунад
-
Extension ClassLoader – боркунаки васеъшавӣ.
синфҳои васеъкуниро, ки ба таври нобаёнӣ дар директорияи jre/lib/ext ҷойгиранд, бор мекунад, аммо онҳоро бо моликияти системаи java.ext.dirs муқаррар кардан мумкин аст.
-
System ClassLoader - боркунаки система.
синфҳои барномаро, ки дар тағирёбандаи муҳити CLASSPATH муайян шудаанд, бор мекунад
Синфи абстрактии 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)
. Дар зер шумо ин диаграммаро дар диаграмма мебинед.
Хамчун хулоса
Дар қадамҳои аввалини омӯзиши забон, барои фаҳмидани чигунагии дарсҳо дар Java зарурати махсус вуҷуд надорад, аммо донистани ин принсипҳои асосӣ ба шумо кӯмак мекунад, ки ҳангоми дучор шудан бо хатогиҳо ба монандиClassNotFoundException
ё NoClassDefFoundError
. Хуб, ё ҳадди аққал тақрибан дарк кунед, ки решаи мушкилот дар чист. Ҳамин тариқ, истисно ClassNotFoundException
вақте рух медиҳад, ки синф ҳангоми иҷрои барнома ба таври динамикӣ бор карда мешавад, вақте ки боркунакҳо синфи заруриро на дар кэш ё дар роҳи синф пайдо карда наметавонанд. Аммо хатогӣ NoClassDefFoundError
муҳимтар аст ва вақте рух медиҳад, ки синфи зарурӣ ҳангоми тартиб додан дастрас буд, аммо ҳангоми иҷрои барнома намоён набуд. Ин метавонад рӯй диҳад, агар барнома дохил кардани китобхонаи истифодашударо фаромӯш карда бошад. Хуб, худи далели фаҳмидани принсипҳои сохтори асбобе, ки шумо дар кори худ истифода мебаред (на ҳатман ғарқ кардани дақиқ ва муфассал дар умқи он) ба фаҳмиши равандҳое, ки дар дохor ин механизм ба амал меоянд, равшанӣ мебахшад. гардиш, боиси дилпурона истифода бурдани ин восита мегардад.
GO TO FULL VERSION