Java Classloader - Java Classloader

The Java Class Loader бөлігі болып табылады Java Runtime Environment бұл динамикалық жүктейді Java сыныптары ішіне Java виртуалды машинасы.[1] Әдетте сыныптар тек жүктеледі талап ету бойынша. Java іске қосу уақыты үшін файлдар мен файлдық жүйелер туралы білудің қажеті жоқ өкілетті сынып оқушысына.

A бағдарламалық кітапхана байланысты жиынтығы объект коды.Ішінде Java тілі, кітапханалар әдетте пакетке салынған JAR файлдары. Кітапханаларда әртүрлі типтегі объектілер болуы мүмкін. Jar файлында қамтылған объектінің маңызды түрі - а Java сыныбы. Сыныпты кодтың аталған бірлігі ретінде қарастыруға болады. Сынып жүктеушісі кітапханалардың орналасуына, олардың мазмұнын оқуға және кітапхананың құрамына кіретін сыныптардың жүктелуіне жауап береді. Бұл жүктеме әдетте «тапсырыс бойынша» жасалады, өйткені ол бағдарлама бағдарламаны шақырғанға дейін болмайды. Берілген аты бар класты берілген жүктеуші тек бір рет жүктей алады.

Әрбір Java сыныбын класс жүктеушісі жүктеуі керек.[2] Сонымен қатар, Java бағдарламалар қолдануы мүмкін сыртқы кітапханалар (яғни бағдарлама авторынан басқа біреу жазған және ұсынған кітапханалар) немесе олар, кем дегенде, ішінара, бірқатар кітапханалардан тұруы мүмкін.

JVM іске қосылған кезде үш класс жүктегіштері қолданылады:[3][4]

  1. Bootstrap класс жүктегіші
  2. Кеңейтілім класы жүктегіші
  3. Жүйелік класс жүктегіші

Жүктеуші жүктеме негізгі Java кітапханаларын жүктейді[fn 1] орналасқан / jre / lib анықтамалық. JVM ядросының құрамына кіретін бұл класс жүктегіші жергілікті кодта жазылған.

Extensions класс жүктегіші кеңейтімдер каталогына кодты жүктейді ( / jre / lib / ext,[3] немесе көрсетілген басқа каталог java.ext.dirs жүйенің қасиеті). Ол жүзеге асырады sun.misc.Launcher $ ExtClassLoader сынып.

Жүйелік класс жүктегіші кодты жүктейді java.class.path, ол кескін картаны көрсетеді КЛАССПАТ орта айнымалы. Мұны жүзеге асырады sun.misc.Launcher $ AppClassLoader сынып.

Пайдаланушы анықтаған класс жүктегіштері

Java класс жүктегіші Java тілінде жазылған. Сондықтан Java виртуалды машинасының ұсақ бөлшектерін түсінбестен өзіңіздің сынып жүктегішіңізді жасауға болады. Кез-келген Java класс жүктегішінде жаңа класс жүктегіші орнатылған немесе виртуалды машинаның әдепкі класы жүктеушісі орнатылған кезде анықталған ата-аналық жүктеуші болады.

Бұл мүмкіндік береді (мысалы):

  • жұмыс уақытында сыныптарды жүктеу немесе түсіру үшін (мысалы, жұмыс уақытында кітапханаларды динамикалық түрде жүктеу үшін, тіпті HTTP ресурс). Бұл маңызды функция:
    • сияқты сценарий тілдерін жүзеге асыру Джитон
    • қолдану бұршақ құрылысшылар
    • пайдаланушы анықтайтын мүмкіндік кеңейту
    • бірнеше мүмкіндік береді атаулар кеңістігі қарым-қатынас жасау. Бұл негіздердің бірі CORBA / RMI мысалы, хаттамалар.
  • жолын өзгерту байт коды жүктелген (мысалы, қолдануға болады) шифрланған Java класс байт коды[5]).
  • жүктелген байт-кодты өзгерту үшін (мысалы, жүктеу уақыты үшін) тоқу пайдалану кезіндегі аспектілер бағдарлы бағдарламалау ).

Джакартадағы жүк тиегіштер

Джакарта (бұрын Java EE және J2EE) қолданбалы серверлер әдетте орналастырылған сыныптарды жүктейді СОҒЫС немесе ҚҰЛАҚ бағдарламаны басқа қосымшалардан оқшаулайтын, бірақ орналастырылған модульдер арасында сыныптарды бөлетін сынып жүктеушілер ағашының мұрағаты. «Деп аталатын»сервлет ыдыстары «әдетте бірнеше сыныптық жүктеушілер тұрғысынан жүзеге асырылады.[2][6]

JAR тозақ

JAR тозақ - ұқсас термин DLL тозақ сынып жүктеу процесінің нәтижесіз аяқталуының барлық әр түрлі тәсілдерін сипаттау үшін қолданылады.[7] JAR тозақтың пайда болуының үш тәсілі:

  • Жүйеге орнатылған кітапхананың екі түрлі нұсқасының кездейсоқ болуы. Бұл жүйенің қателігі болып саналмайды. Керісінше, жүйе сыныптарды сол немесе басқа кітапханадан жүктейді. Оны ауыстырудың орнына жаңа кітапхананы қол жетімді кітапханалар тізіміне қосу қосымшаның ескі кітапхана қолданыстағы күйінде қалуына әкелуі мүмкін, мүмкін ол мүмкін.
  • Бірнеше кітапханалар немесе қосымшалар кітапхананың әр түрлі нұсқаларын қажет етеді ақымақ. Егер кітапхана нұсқалары болса ақымақ бірдей сынып атауларын қолданыңыз, кітапхана нұсқаларын жүктеу мүмкіндігі жоқ ақымақ сол сынып жүктегішімен.
  • JAR тозағының ең күрделі проблемалары сынып жүктеу жүйесінің толық күрделілігін пайдаланатын жағдайларда туындайды. Java бағдарламасынан тек бір ғана «тегіс» сынып жүктегішті қолдану қажет емес, оның орнына бірнеше (ықтимал өте көп) кірістірілген, ынтымақтастықта жұмыс жасайтын сынып тиегіштерден тұруы мүмкін. Әр түрлі сынып тиегіштер жүктейтін сыныптар өзара әрекеттесуі мүмкін, олар әзірлеуші ​​толық түсінбейді, нәтижесінде қателер немесе қателер пайда болады, оларды талдау, түсіндіру және шешу қиын.[8]

The OSGi Альянс (1998 жылы JSR 8-ден бастап) кеңінен қабылданған ME, SE және EE-дегі қазіргі және болашақтағы VM үшін тозаңды шешуге бағытталған модульдік негізді көрсетті. JAR-да метадеректерді пайдалану манифест, JAR файлдары (бумалар деп аталады) пакетке сыммен қосылады. Бумалар пакеттерді экспорттай алады, бумаларды импорттай алады және пакеттерді жеке сақтай алады, бұл модульдік және құрылымдық тәуелділіктің негізгі құрылымдарын қамтамасыз етеді.

JAR тозақ проблемаларын жою үшін, а Java қауымдастық процесі - JSR 277 2005 жылы басталған. Қарар - Java платформасы модулі жүйесі - жаңа тарату пішімін, модульдер нұсқасының схемасын және жалпы репозиторийді енгізуге арналған (мақсаты ұқсас Microsoft .NET Келіңіздер Ғаламдық ассемблер ). 2008 жылдың желтоқсанында Sun JSR 277 кідіртілді деп жариялады.[9] Java модулі жүйесі кейінірек «жоба Jigsaw» ретінде қайта жүктелді[10] енгізілген Java 9.

Сондай-ақ қараңыз

Сілтемелер

  1. ^ Бұл кітапханалар сақталған Құмыра файлдары деп аталады rt.jar, core.jar, server.jarжәне т.б.

Әдебиеттер тізімі

  1. ^ Макманис, Чак (1 қазан 1996). «Java класс жүктегіштерінің негіздері». JavaWorld. Алынған 2020-07-13.
  2. ^ а б Кристудас, Бинильдас (26 қаңтар 2005). «Java Class жүктеу интералдары». onjava.com. Архивтелген түпнұсқа 2018-05-10.
  3. ^ а б «Кеңейту класының жүктелуін түсіну». Java оқулықтары. docs.oracle.com. Алынған 2020-07-13.
  4. ^ Сосноски, Деннис (2003 ж. 29 сәуір). «Сыныптар және сынып жүктемесі». IBM DeveloperWorks. Алынған 2008-01-26.
  5. ^ Рубцов, Владимир (9 мамыр 2003). «Java-кодтық шифрлауды бұзу». JavaWorld. Алынған 2020-07-13.
  6. ^ deBoer, Тим; Карасюк, Гари (21 тамыз 2002). «J2EE класс жүктемесі анықталды». IBM DeveloperWorks. Алынған 2008-01-26.
  7. ^ https://web.archive.org/web/20130601002059/http://incubator.apache.org/depot/version/jar-hell.html
  8. ^ http://articles.qos.ch/classloader.html
  9. ^ Марк Рейнхольд (20 қыркүйек, 2010 жыл). «Джигсо жобасы». Oracle корпорациясы. Архивтелген түпнұсқа 2015-12-08.
  10. ^ «Джигсо жобасы». Oracle корпорациясы. Алынған 2015-11-29.

Сыртқы сілтемелер