logo

„ClassLoader“ Java

Java ClassLoader

Java ClassLoader yra abstrakti klasė. Ji priklauso a java.lang paketą. Jis įkelia klases iš skirtingų išteklių. „Java ClassLoader“ naudojama klasėms įkelti vykdymo metu. Kitaip tariant, JVM susiejimo procesą atlieka vykdymo metu. Klasės įkeliamos į JVM pagal poreikį. Jei įkelta klasė priklauso nuo kitos klasės, ta klasė taip pat įkeliama. Kai prašome įkelti klasę, ji perduoda klasę savo pirminei grupei. Tokiu būdu vykdymo aplinkoje išlaikomas unikalumas. Būtina paleisti Java programą.

funkcijos c
„ClassLoader“ Java

„Java ClassLoader“ yra pagrįsta trimis principais: Delegacija , Matomumas , ir Unikalumas .

    Delegavimo principas:Jis persiunčia užklausą dėl klasės įkėlimo į pirminės klasės įkėlimo programą. Jis įkelia klasę tik tuo atveju, jei tėvas neranda arba neįkelia klasės.Matomumo principas:Tai leidžia antrinės klasės įkrovikliui matyti visas klases, kurias įkėlė pirminis ClassLoader. Tačiau pagrindinės klasės įkėlimo programa nemato klasių, įkeltų antrinės klasės įkėlimo programos.Unikalumo principas:Tai leidžia vieną kartą įkelti klasę. Tai pasiekiama delegavimo principu. Tai užtikrina, kad antrinis ClassLoader neįkeltų klasės, kurią jau įkėlė pirminis asmuo.

ClassLoader tipai

Java programoje kiekvienas ClassLoader turi iš anksto nustatytą vietą, iš kurios jie įkelia klasės failus. „Java“ yra šie „ClassLoader“ tipai:

Bootstrap klasės įkroviklis: Jis įkelia standartinius JDK klasės failus iš rt.jar ir kitų pagrindinių klasių. Tai yra visų klasių krautuvų pirminė. Ji neturi jokių tėvų. Kai iškviečiame String.class.getClassLoader(), jis grąžina nulį, o bet koks juo pagrįstas kodas meta NullPointerException. Jis taip pat vadinamas „Primordial ClassLoader“. Jis įkelia klasės failus iš jre/lib/rt.jar. Pavyzdžiui, java.lang paketo klasė.

Papildinių klasės įkroviklis: Jis perduoda klasės įkėlimo užklausą savo pirminiam asmeniui. Jei klasės įkėlimas nepavyksta, jos įkeliamos iš jre/lib/ext katalogo arba bet kurio kito katalogo kaip java.ext.dirs. JVM jį įgyvendina sun.misc.Launcher$ExtClassLoader.

Sistemos klasės įkroviklis: Jis įkelia specifines programas klases iš aplinkos kintamojo CLASSPATH. Jį galima nustatyti iškviečiant programą naudojant komandinės eilutės parinktis -cp arba classpath. Tai yra Extension ClassLoader antrinė dalis. Jį įgyvendina sun.misc.Launcher$AppClassLoader klasė. Visi Java ClassLoader įgyvendina java.lang.ClassLoader.

„ClassLoader“ Java

Kaip „ClassLoader“ veikia „Java“.

Kai JVM užklausa klasės, ji iškviečia java.lang.ClassLoader klasės metodą loadClass() perduodant visiškai įslaptintą klasės pavadinimą. LoadClass() metodas reikalauja findLoadedClass() metodo, kad patikrintų, ar klasė jau buvo įkelta, ar ne. Būtina vengti kelių kartų įkelti klasę.

Jei klasė jau įkelta, ji perduoda užklausą pirminiam ClassLoader įkelti klasę. Jei „ClassLoader“ neranda klasės, ji iškviečia metodą findClass(), kad ieškotų klasių failų sistemoje. Šioje diagramoje parodyta, kaip „ClassLoader“ įkelia klasę „Java“ naudojant delegavimą.

„ClassLoader“ Java

Tarkime, kad turime konkrečios programos klasę Demo.class. Prašymas įkelti šios klasės failus perkeliamas į „Application ClassLoader“. Jis perduoda savo pagrindiniam plėtinio ClassLoader. Be to, jis perduodamas Bootstrap ClassLoader. Bootstrap ieško tos klasės rt.jar ir kadangi tos klasės ten nėra. Dabar paprašykite perkelti į Extension ClassLoader, kuri ieško katalogo jre/lib/ext ir bando ten rasti šią klasę. Jei klasė randama ten, „Extension ClassLoader“ įkelia tą klasę. „Application ClassLoader“ niekada neįkelia tos klasės. Kai plėtinys ClassLoader jo neįkelia, programa ClaasLoader įkelia jį iš CLASSPATH Java.

Matomumo principas teigia, kad antrinis ClassLoader gali matyti pirminio ClassLoader įkeltą klasę, tačiau atvirkščiai – netiesa. Tai reiškia, kad jei Application ClassLoader įkelia Demo.class, tokiu atveju bandant įkelti Demo.class aiškiai naudojant plėtinį ClassLoader išmeta java.lang.ClassNotFoundException.

Pagal unikalumo principą pagrindinės klasės įkeltos klasės Child ClassLoader neturėtų būti įkeliama dar kartą. Taigi, galima parašyti klasės įkroviklį, kuris pažeidžia delegavimo ir unikalumo principus ir įkelia klasę savaime.

Trumpai tariant, klasės krautuvas laikosi šios taisyklės:

  • Jis patikrina, ar klasė jau įkelta.
  • Jei klasė neįkelta, paprašykite pagrindinės klasės įkėlimo programos įkelti klasę.
  • Jei pagrindinės klasės įkėlimo programa negali įkelti klasės, pabandykite ją įkelti šioje klasės įkėlimo programoje.

Apsvarstykite šį pavyzdį:

 public class Demo { public static void main(String args[]) { System.out.println('How are you?'); } } 

Sukompiliuokite ir paleiskite aukščiau pateiktą kodą naudodami šią komandą:

 javac Demo.java java -verbose:class Demo 

-verbose:class: Jis naudojamas informacijai apie JVM įkeliamas klases rodyti. Tai naudinga naudojant klasių įkroviklį dinaminiam klasių įkėlimui. Toliau pateiktame paveikslėlyje parodyta išvestis.

„ClassLoader“ Java

Galime pastebėti, kad pirmiausia įkeliamos vykdymo klasės, reikalingos programos klasei (Demo).

Kai įkeliamos pamokos

Yra tik du atvejai:

  • Kai vykdomas naujas baito kodas.
  • Kai baito kodas daro statinę nuorodą į klasę. Pavyzdžiui, System.out .

Statinis ir dinaminis klasės įkėlimas

Klasės statiškai apkraunamos „nauju“ operatoriumi. Dinaminis klasės įkėlimas iškviečia klasės įkėlimo funkcijas vykdymo metu, naudojant Class.forName() metodą.

Skirtumas tarp loadClass() ir Class.forName()

Metodas loadClass() įkelia tik klasę, bet nepainicijuoja objekto. Nors metodas Class.forName() inicijuoja objektą jį įkėlus. Pavyzdžiui, jei JDBC tvarkyklei įkelti naudojate ClassLoader.loadClass(), klasės įkėlimo programa neleidžia įkelti JDBC tvarkyklės.

Metodas java.lang.Class.forName() grąžina klasės objektą kartu su klase arba sąsajomis su nurodytos eilutės pavadinimu. Ji išmeta ClassNotFoundException, jei klasė nerasta.

Pavyzdys

Šiame pavyzdyje įkeliama java.lang.String klasė. Jis spausdina klasės pavadinimą, paketo pavadinimą ir visų galimų String klasės metodų pavadinimus. Šiame pavyzdyje naudojame Class.forName().

Klasė: Reiškia klasės objektą, kuris gali būti bet kokio tipo (? yra pakaitos simbolis). Klasės tipe yra metainformacija apie klasę. Pavyzdžiui, String.class tipas yra klasė. Naudokite Klasę, jei modeliuojama klasė nežinoma.

getDeclaredMethod(): Grąžina masyvą, kuriame yra Method objektai, atspindintys visus deklaruotus klasės ar sąsajos metodus, atstovaujamus šio klasės objekto, įskaitant viešą, apsaugotą, numatytąją (paketo) prieigą ir privačius metodus, bet neįskaitant paveldėtų metodų.

getName(): Jis grąžina metodo pavadinimą, kurį reprezentuoja šis Method objektas, kaip eilutę.

 import java.lang.reflect.Method; public class ClassForNameExample { public static void main(String[] args) { try { Class cls = Class.forName('java.lang.String'); System.out.println('Class Name: ' + cls.getName()); System.out.println('Package Name: ' + cls.getPackage()); Method[] methods = cls.getDeclaredMethods(); System.out.println('-----Methods of String class -------------'); for (Method method : methods) { System.out.println(method.getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 

Išvestis

 Class Name: java.lang.String Package Name: package java.lang -----Methods of String class ------------- value coder equals length toString hashCode getChars ------ ------ ------ intern isLatin1 checkOffset checkBoundsOffCount checkBoundsBeginEnd access0 access0