Sobes.tech
Middle

Kas ir ClassLoader Java?

sobes.tech AI

Atbilde no AI

Java ClassLoader ir ir abstrakta klase (java.lang.ClassLoader), kas atbild par klasu ielādi darba laikā. Tas atrod klases baitkodu (.class failu), pārvērš to par Class objektu un saglabā to JVM atmiņā.

Galvenās ClassLoader funkcijas:

  • Ielāde: Klases baitkoda lasīšana no dažādiem avotiem (faila, tīkla utt.).
  • Pārbaude: Drošības pārbaudes uz ielādētā baitkoda.
  • Saistīšana (Linking):
    • Verifikācija (Verification): Baitkoda pareizības pārbaude.
    • Sagatavošana (Preparation): Statisko mainīgo inicializācija ar noklusējuma vērtībām.
    • Rezolūcija (Resolution): Klases ielāde, uz kurām atsaucas pašreizējā klase, ja nepieciešams (dinamiski).
  • Iniciācija (Initialization): Statisko bloku un statisko mainīgo piešķiršana.

ClassLoader hierarhija:

Java ir ClassLoader hierarhija ar deleģēšanu:

  1. Bootstrap ClassLoader: ielādē galvenās JDK klases (rt.jar). Rakstīts C++ un ir JVM daļa.
  2. Extension ClassLoader: ielādē klases no direktorijas jre/lib/ext. Tas ir vecāks par Bootstrap ClassLoader.
  3. System (Application) ClassLoader: ielādē klases no lietojumprogrammas direktorijas (classpath). Tas ir vecāks par Extension ClassLoader. Atgriež metodi ClassLoader.getSystemClassLoader().

Ielādējot klasi, ClassLoader vispirms deleģē pieprasījumu savam vecākam ClassLoader. Ja vecāks nevar atrast vai ielādēt klasi, pašreizējais ClassLoader mēģina to atrast pats. Tas novērš vienas un tās pašas klases vairākas ielādes un nodrošina saskaņotību.

Piemērs, kā iegūt ClassLoader:

// Iegūt sistēmas ClassLoader
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

// Iegūt Object klases ClassLoader
ClassLoader objectClassLoader = Object.class.getClassLoader();

Savu ClassLoader:

Jūs varat izveidot savus ClassLoader, mantojot no ClassLoader, lai ielādētu klases no nestandarta avotiem vai izmantotu īpašu ielādes loģiku.

// Vienkāršs Custom ClassLoader piemērs (demonstrācijai)
class CustomClassLoader extends ClassLoader {

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // Reālam scenārijam šeit būtu baitkoda lasīšanas loģika
        throw new ClassNotFoundException(name);
    }
}

ClassLoader ir svarīgi moduļiem, drošībai un dinamiskai koda ielādei Java.