ClassLoader clasa dinamichkeskaya de încărcare - dmitriymx blog-

ClassLoader: dinamichkeskaya clasa de încărcare

ClassLoader clasa dinamichkeskaya de încărcare - dmitriymx blog-

Iată o întrebare simplă: cum clase sunt identificate în JVM. Răspunsul corect este: numele complet al clasei constând din numele pachetului și numele clasei proprie. Din aceasta concluzia este că programul nu poate exista două clase cu același nume completă. Cu toate acestea, nu este. Ca o școală primară în cazul în care am fost învățați regula „nu se poate diviza de la zero“, și apoi în liceu, a spus despre infinit, iar în Java este o „mică minciună albă“.

De fapt, clasele sunt identificate prin numele pachetului, propriul nume și clasă. încărcător, ClassLoader „y. Astfel, programul poate fi două clase cu nume identice complete și să nu interfereze unul cu celălalt.

Pe aceasta și alte bunătăți ClassLoader „și astăzi vom vorbi.

Una dintre cele mai importante caracteristici ale Java este dinamic model din clasa de încărcare, care vă permite să încărcați codul executabil fără a reîncărca aplicația principală în JRE. Orice clasă utilizată în timpul rulării oricum a fost încărcat orice încărcător în Java. Până la începutul programului, a creat trei bootloader principale:

  • Bootstrap ClassLoader - încărcător de bază;
  • ClassLoader Extension - extensii încărcător;
  • ClassLoader Sistem - boot loader.

ClassLoader Bootstrap implementat la nivelul JVM și nu are nici un feedback din mediul runtime. Conform claselor încarcă încărcător din directorul $ JAVA_HOME / lib și toate clasele de bază. Prin urmare, o încercare de a obține un java încărcător de clasă. * Se termină întotdeauna null'om. Dar dacă într-adevăr doriți să controlați de încărcare clasă de bază, puteți utiliza tasta -Xbootclasspath. care vă permite să suprascrie setul de clase de bază.

Extinderea ClassLoader sarcini clase din directorul $ JAVA_HOME / lib / ext. Sun JRE - o clasa sun.misc.Launcher $ ExtClassLoader. Gestionați extensiile Puteți utiliza opțiunea sistemul de boot java.ext.dirs.

Sistemul ClassLoader implementat deja în nivelul JRE. Sun JRE - o clasa sun.misc.Launcher $ AppClassLoader. Acest încărcător încarcă clase, calea la care este specificat în variabila de mediu CLASSPATH. Controlați clasele de sistem de încărcare prin utilizarea -classpath sau sistem cheie opțiune

ClassLoader formează o ierarhie, care este un încărcător de bază rădăcină. Toate celelalte încarcatoare la inițializarea păstrează o legătură cu încărcătorul-mamă. Astfel, realizat realizarea de încărcare model de delegare.

ClassLoader clasa dinamichkeskaya de încărcare - dmitriymx blog-

Clasa de descărcare dreapta recursiv delegat din încărcătorul inferior în ierarhia la cel mai înalt. Această abordare permite încărcătorul pentru a încărca clase, în care este cât mai aproape de bază. Aceasta atinge domeniul de aplicare maximă a clasei. În conformitate cu domeniul de aplicare înseamnă: fiecare downloader ține o evidență a claselor care au fost încărcate cu ei. Multe dintre aceste clase și aceste zone apar. În acest caz, încărcătorul vede doar clasa „lor“ și clasa „mamă“ și nu are nici o idee despre clasele care au fost încărcate cu „urmașul“ lui.

Luați în considerare procesul de încărcare mai detaliat. Lăsați timpul rulării cu declarația variabilă utilizează clasa Bagira. Apoi, procesul de căutare de clasă și descărcarea va fi după cum urmează:

ClassLoader clasa dinamichkeskaya de încărcare - dmitriymx blog-

Acum, cred că: ce clasă este cu adevărat încărcat, în cazul în care $ JAVA_HOME / lib / ext și CLASSPATH au clase cu aceleași nume complete? Asta-i drept, clasa de $ JAVA_HOME / lib / ext. și nimeni nu se uită la CLASSPATH. Deși totul nu este doar pentru el: clase sunt încărcate în ordinea în care au fost specificate în CLASSPATH. La acest punct, în cazul în care două borcan-fișier, de exemplu a.jar și b.jar, care conține aceleași clase, în memoria de a.jar clasa încărcată, iar clasa b.jar trebuie ratat

Repet: fiecare ClassLoader vede clasa „lor“ și clasa „părinte“. Clase „descendenți“, mult mai puține clase „care rulează în paralel“ downloader, The ClassLoader nu vezi. Mai mult decât atât, pentru JVM - acestea sunt clase diferite. Când încercați să aducă o clasă la alta va provoca java.lang.ClassCastException excepție. chiar dacă acestea sunt aceleași și complete nume.

Acum, de la vorbe la fapte. Dacă vom crea un încărcător de clasă, este important să ne amintim următoarele:

  • încărcător trebuie să se extindă în mod explicit sau implicit clasa java.lang.Classloader;
  • model de delegare încărcător trebuie să suporte sarcina ierarhiei. Dacă acest lucru nu se face, pot exista probleme cu domeniul de aplicare;
  • clasă java.lang.Classloader deja pus în aplicare metoda de descărcare directă - defineClass (). care convertește codul de octet în java.lang.Class. efectuarea de validarea acestuia;
  • mecanism de căutare recursiv este, de asemenea, implementat în java.lang.Classloader clasă și să aibă grijă de ea nu este necesară;
  • pentru punerea în aplicare corectă a încărcătorului trebuie să suprascrie numai loadClass metoda (clasa java.lang.Classloader).

încărcător nostru de boot va încărca-borcan fișierele nu sunt prin java.net.URLClassLoader. și „manual“. Deci, se va vedea mai clar întregul proces. Și vom livra plugin-uri care sunt localizate în plugin-uri / folder și interfața pentru care doriți să le descrie:

Acum să scrie loader cizma. Adevărul este că suntem puțin smuhlyuem și încărcați plugin-ul odată ce toate clasele din memorie:

Acum să scrie cererea de bază folosind instrumentul nostru de încărcare

Excelent. Rămâne să scrie plugin-ul:

Noi pachet nostru plug-in borcan și se depozitează în plugin-uri / directorul.

Da, suntem un pic „ieftin“, rigid arătând spre aplicația principală care clasă este considerată un punct de intrare, dar aceasta nu va afecta imaginea de ansamblu a ceea ce se întâmplă. Programul nostru va încărca cu succes plug-in și pentru a se conforma rula sale metoda ().

Oh, aproape am uitat. “. Programul poate fi două clase cu același nume completă și nu interferează unele cu altele. “. Îmi amintesc, amintiți-vă acum arată.

Voila, două din aceeași clasă de lucru pentru noi și nu în conflict. Cu toate acestea, dacă încercăm să facem acest lucru: JVM ne va trimite în iad (java.lang.ClassCastException), pentru că este JVM două clase complet diferite.