Ano ang tungkulin para sa isang ClassLoader sa Java?



Ang artikulong ito ay isang komprehensibong gabay sa kung paano gumagana ang ClassLoader sa Java. Tinatalakay nito ang mga uri, prinsipyo at pamamaraan ng ClassLoader sa Java.

Habang nagtatrabaho sa Java, madalas kaming gumagamit ng maraming bilang ng mga klase. Ang mga klase sa Java na ito ay hindi na-load nang sabay-sabay sa memorya, sa halip, nai-load ang mga ito kapag kinakailangan ng isang application. Dito nagmula ang larawan sa Java ClassLoaders. Kaya sa artikulong ito, tatalakayin ko kung paano gamitin ang ClassLoader sa Java kasama ang mga halimbawa.

Ang mga sumusunod na paksa ay saklaw sa artikulong ito:





  1. Ano ang ClassLoader?
  2. Mga uri ng ClassLoader
  3. Mga Prinsipyo ng ClassLoader
  4. Mga Paraan ng ClassLoader
  5. Pasadyang ClassLoader

Magsimula tayo!

Ano ang ClassLoader sa Java?

Ang ClassLoader sa Java ay tinawag ng Java Runtime Environment upang ma-dynamically i-load ang mga klase tuwing kinakailangan ng aplikasyon sa Java Virtual Machine . Dahil ang ClassLoaders ay bahagi ng Java Runtime Environment, ang Java Virtual Machine ay walang ideya tungkol sa pinagbabatayan ng mga file ng file at file.



Ngayon, ipaalam sa amin na maunawaan ang iba't ibang mga uri ng built-in na ClassLoaders sa Java.

Mga uri ng ClassLoader sa Java

Ang iba't ibang mga uri ng ClassLoaders sa Java ay ang mga sumusunod:

Talakayin natin isa-isa ang bawat isa sa kanila.



Extension ClassLoader

Tulad ng ipinahihiwatig ng pangalan na na-load ng Extension ClassLoader ang mga extension ng pangunahing mga klase ng Java mula sa JDK Extension library. Ito ay isang anak ng Bootstrap ClassLoader at nilo-load ang mga extension mula sa direktoryo ng JRE / lib / text o anumang iba pang direktoryo na tinukoy sa pag-aari ng system ng java.ext.dirs.

Application o System ClassLoader

Ang Application o ang System ClassLoader ay isang anak ng Extension ClassLoader. Ang ganitong uri ng ClassLoader ay naglo-load ng lahat ng mga klase sa antas ng aplikasyon na matatagpuan sa pagpipiliang -cp command-line o sa variable ng kapaligiran ng CLASSPATH.

Bootstrap ClassLoader

Tulad ng alam nating lahat Mga Klase sa Java ay na-load ng isang halimbawa ng java.lang.ClassLoade. Ngunit, dahil ang ClassLoaders ay mga klase, responsable ang Bootstrap ClassLoader na i-load ang mga panloob na klase ng JDK. Ang BootStrap ClassLoader ay isang machine code na nagsisimula sa pagpapatakbo kapag tinawag ito ng JVM at na-load ang mga klase mula sa rt.jar. Kaya, maaari mong maunawaan na ang serbisyo ng Bootstrap ClassLoader ay walang magulang ClassLoader at sa gayon ay kilala bilang Primordial ClassLoader.

Tandaan: Ang priyoridad ng Bootstrap ay mas mataas kaysa sa Extension, at ang prayoridad na ibinigay sa Extension ClassLoader ay mas mataas kaysa sa Application ClassLoader. Sumangguni sa imahe sa ibaba:

pagsubok sa cross browser sa siliniyum

Mga uri ng ClassLoader - ClassLoader sa Java - Edureka

Susunod sa artikulong ito, maunawaan natin ang mga prinsipyo kung saan gumagana ang ClassLoader.

Mga Prinsipyo ng ClassLoader sa Java

Ang hanay ng mga patakaran batay sa kung saan gumagana ang Java ClassLoader ay ang mga sumusunod na tatlong mga prinsipyo:

Unawain natin ang bawat isa sa kanila.

Pagkatangi ng Pag-aari

Tinitiyak ng pag-aari na ito na walang pag-uulit ng mga klase at lahat ng mga klase ay natatangi. Tinitiyak din ng natatanging pag-aari na ang mga klase ay na-load ng magulang na ClassLoader ay hindi na-load ng batang ClassLoader. Sa isang senaryo, kung saan hindi mahanap ng magulang na ClassLoader ang klase, pagkatapos ay susubukan ng kasalukuyang halimbawa na gawin ito nang mag-isa.

Modelo ng Delegasyon

Gumagawa ang ClassLoader sa Java batay sa hanay ng mga pagpapatakbo na ibinigay ng Modelong Delegasyon. Kaya, tuwing nabuo ang isang kahilingan upang makahanap ng isang klase o isang mapagkukunan, pagkatapos ay isang halimbawa ng ClassLoader ang magtatalaga ng paghahanap ng klase o mapagkukunan sa magulang na ClassLoader.

Ang hanay ng mga pagpapatakbo batay sa kung saan gumagana ang ClassLoader ay ang mga sumusunod:

  • Suriin ng Java Virtual Machine kung ang klase ay na-load o hindi, tuwing ito ay makarating sa isang klase.
  • Sa kaso kung saan na-load ang klase JVM nalikom sa pagpapatupad ng klase, ngunit sa isang senaryo kung saan ang klase ay hindi na-load, pagkataposHiningi ng JVM ang sub-system ng Java ClassLoader na mai-load ang partikular na klase. Pagkatapos nito, nagbibigay ang sub-system ng ClassLoader ng kontrol sa Application ClassLoader.
  • Pagkatapos ay iginawad ng Application ClassLoader ang kahilingan sa Extension ClassLoader, na pagkatapos ay ipinapasa ang kahilingan sa Bootstrap ClassLoader.
  • Ngayon, ang Bootstrap ClassLoader ay naghahanap saBootstrap classpath upang suriin kung ang klase ay magagamit o hindi. Kung ang klase ay magagamit, pagkatapos ito ay nai-load, kung hindi ang kahilingan ay muling naipasa sa Extension ClassLoader.
  • Sinusuri ng Extension ClassLoader ang klase sa extension classpath.Kung ang klase ay magagamit, pagkatapos ito ay nai-load, kung hindi ang kahilingan ay muling naipasa sa Application ClassLoader.
  • Sa wakas, naghahanap ang Application ClassLoader ng klase sa classpath ng application.Kung ang klase ay magagamit, pagkatapos ay mai-load, kung hindi makakakita ka ng isang pagbubukod ng ClassNotFoundException.

Sumangguni sa imahe sa ibaba.

Prinsipyo ng Visibility

Ayon sa prinsipyong ito, ang mga klase ng mga bata ay nakikita ng mga klase na na-load ng magulang nitong ClassLoaders, ngunit ang kabaligtaran ay hindi totoo. Kaya, ang mga klase na na-load ng Application ClassLoader ay may kakayahang makita sa mga klase na na-load ng Extension at Bootstrap ClassLoader.

Halimbawa, kung mayroon kaming dalawang klase: A & B, ipalagay na ang klase A ay na-load ng Application ClassLoader at ang class B ay na-load ng Extension ClassLoader. Dito, ang mga klase A at B ay nakikita ng lahat ng mga klase na na-load ng Application ClassLoader, ngunit ang klase B ay makikita lamang sa mga klase na na-load ng Extension ClassLoader.

Gayundin, kung susubukan mong i-load ang mga klase na ito gamit ang Bootstrap ClassLoader, makikita mo ang java.lang.ClassNotFoundException . pagbubukod

O sige, ngayong alam mo na ang mga uri ng ClassLoaders at mga prinsipyo sa likod nito, tingnan natin ang ilang mahahalagang pamamaraangaling sa java.lang.ClassLoader klase

Mga Paraan ng ClassLoader sa Java

Kakaunti ang mahalaga ng ClassLoader ay ang mga sumusunod:

loadClass (Pangalan ng string, paglutas ng boolean)

Ang pamamaraang ito ay ang entry point ng ClassLoader at ginagamit upang mai-load ang klase na isinangguni ng JVM. Kinukuha nito ang pangalan ng bilang isang parameter. Inanyayahan ng JVM ang paraan ng loadClass () upang malutas ang mga sanggunian sa klase sa pamamagitan ng pagtatakda ng halaga ng boolean sa totoo. Lamang kung kailangan naming matukoy kung mayroon ang klase o wala, ang boolean parameter ay nakatakda sa hindi totoo.

Deklarasyon:

publikong Class Class loadClass (String pangalan, paglutas ng boolean) ay nagtatapon ng ClassNotFoundException {

tukuyin ang Klase ()

Isang pangwakas na pamamaraan na ginamit upang tukuyin ang isang hanay ng mga byte bilang isang halimbawa ng isang klase. Kung sakaling ang klase ay hindi wasto pagkatapos, nagtatapon ito ng isang ClassFormatError.

Deklarasyon:

protektadong pangwakas na Class defineClass (String name, byte [] b, int off, int len) ay nagtatapon ng ClassFormatError

findClass (Pangalan ng string)

Ginagamit ang pamamaraang findClass upang hanapin ang tinukoy na klase. Kaya, hahanapin lamang nito ang klase na may isang ganap na kwalipikadong pangalan bilang isang parameter ngunit hindi nito na-load ang klase. Inilalagay ng pamamaraang loadClass () ang pamamaraang ito kung hindi mahanap ng magulang na ClassLoader ang hiniling na klase. Gayundin, kung walang magulang ng ClassLoader ang makakahanap ng klase ang default na pagpapatupad ay nagtatapon ng a ClassNotFoundException.

Deklarasyon:

protektadong Class findClass (String name) ay nagtatapon ng ClassNotFoundException

Class.forName (String name, boolean initialize, ClassLoader loader)

Ginagamit ang pamamaraang ito upang mai-load at simulan ang klase. Nagbibigay ito ng isang pagpipilian upang pumili ng alinman sa mga ClassLoaders at isama ang ClassLoader na parameter ay NULL, pagkatapos ay awtomatikong ginagamit ang Bootstrap ClassLoader.

Deklarasyon:

pampublikong static na Class forName (String name, gawing initialize ng boolean, ClassLoader loader) na nagtatapon ng ClassNotFoundException

getParent ()

Ginagamit ang pamamaraang getParent upang ibalik ang magulang na ClassLoader para sa pagdelasyon.

Deklarasyon:

pampublikong pangwakas na ClassLoader getParent ()

getResource ()

Tulad ng iminumungkahi ng pangalan, sinubukan ng paraan ng getResource () na makahanap ng isang mapagkukunan na may ibinigay na pangalan. Ipaaila nito sa una ang kahilingan sa magulang na ClassLoader para sa mapagkukunan. Kung sakaling ang magulang ay null, pagkatapos ay hahanapin ang landas ng ClassLoader na binuo sa JVM. Ngayon, kung nabigo ito, tatawagin ng pamamaraan ang findResource (String) upang hanapin ang mapagkukunan, kung saan ang pangalan ng mapagkukunan ay tinukoy bilang isang input na maaaring alinman sa ganap o kamag-anak na klase. Pagkatapos, nagbabalik ito ng isang object ng URL para sa pagbabasa ng mapagkukunan o nagbabalik ng isang null na halaga kung ang mapagkukunan ay walang sapat na mga pribilehiyo upang ibalik ang mapagkukunan o hindi nahanap.

Deklarasyon:

pampublikong URL getResource (pangalan ng String)

Susunod, sa artikulong ito sa ClassLoader sa Java, ipaalam sa amin na maunawaan ang Pasadyang ClassLoader.

Pasadyang ClassLoader sa Java

Ang built-in na ClassLoaders ay mag-aalaga ng karamihan sa mga kaso kung saan ang mga file ay nasa file system na, ngunit kung nais mong i-load ang mga klase mula sa lokal na hard drive kung gayon kailangan mong gumamit ng mga pasadyang ClassLoaders.

Lumikha ng Pasadyang ClassLoader

Upang lumikha ng isang pasadyang ClassLoader, kailangan mong palawakin ang ClassLoader klase at i-override ang findClass () pamamaraan:

Halimbawa: Lumikha tayo ng isang pasadyang ClassLoader na nagpapalawak sa default na ClassLoader at naglo-load ng isang byte na array mula sa tinukoy na file. Sumangguni sa code sa ibaba.

c ++ pag-uuri ng isang array
package edureka import java.io.ByteArrayOutputStream import java.io. I-import ang java.io.IOException import java.io. Ang InputStream na klase sa publiko Ang sample ay nagpapalawak ng ClassLoader {@Orride public Class findClass (String samplename) ay nagtatapon ng ClassNotFoundException {byte [] b = customLoadClick (samplename) ibalik ang kahuluganClass (samplename, b, 0, b.length)} pribadong byte [] customLoadClassFromFile (String demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.', File. separatorChar) + '.class') byte [] buffer ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 subukan {habang ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} buffer = bStream.toByteArray () return buffer}}

Sa pamamagitan nito, natapos na kami sa artikulong ito sa ClassLoader sa Java. Inaasahan kong naintindihan mo kung ano ang ClassLoaders sa Java, ang mga pamamaraan nito, ang iba't ibang uri ng ClassLoaders, atbp.

Kung nakita mo ang artikulong ito sa 'ClassLoader sa Java', tingnan ang ni Edureka, isang pinagkakatiwalaang kumpanya sa pag-aaral sa online na may isang network na higit sa 250,000 nasiyahan na mga nag-aaral na kumalat sa buong mundo. Narito kami upang matulungan ka sa bawat hakbang sa iyong paglalakbay, para sa pagiging isang bukod sa mga katanungang ito sa panayam sa java, nakakakuha kami ng isang kurikulum na idinisenyo para sa mga mag-aaral at propesyonal na nais na maging Java Developer.

May tanong ba sa amin? Mangyaring banggitin ito sa seksyon ng mga komento ng 'ClassLoader sa Java ' at babalik kami sa iyo sa lalong madaling panahon.