Sobes.tech
Middle

Mi az a ClassLoader Java-ban?

sobes.tech MI

Válasz az MI-től

A ClassLoader Java-ban egy absztrakt osztály (java.lang.ClassLoader), amely felelős az osztályok betöltéséért a program futása közben. Megkeresi az osztály bytekódját (.class fájl), átalakítja azt Class objektummá, és elhelyezi a JVM memóriájában.

A ClassLoader fő funkciói:

  • Betöltés: Az osztály bytekódjának olvasása különböző forrásokból (fájl, hálózat stb.).
  • Ellenőrzés: Biztonsági ellenőrzések végrehajtása a betöltött bytekódon.
  • Linkelés:
    • Ellenőrzés: A bytekód helyességének ellenőrzése.
    • Előkészítés: Az osztály statikus változóinak inicializálása alapértelmezett értékekkel.
    • Megoldás (Resolution): Az aktuális osztály által hivatkozott osztályok betöltése, ha szükséges (dinamikusan).
  • Inicializálás: Statikus blokkok és statikus változók hozzárendeléseinek végrehajtása.

A ClassLoader hierarchiája:

A Java hierarchikus ClassLoader rendszert használ delegációval:

  1. Bootstrap ClassLoader: Betölti a JDK fő osztályait (rt.jar). C++-ban íródott, és a JVM része.
  2. Extension ClassLoader: Betölti a jre/lib/ext könyvtárból az osztályokat. A Bootstrap ClassLoader gyermekeként működik.
  3. System (Application) ClassLoader: Betölti az alkalmazás könyvtárából (classpath) az osztályokat. A Extension ClassLoader gyermekeként működik. A ClassLoader.getSystemClassLoader() metódussal érhető el.

Osztály betöltésekor a ClassLoader először delegálja a kérést a szülő ClassLoader-nek. Ha a szülő nem találja vagy nem tudja betölteni az osztályt, a jelenlegi ClassLoader próbálkozik saját maga. Ez megakadályozza ugyanazon osztály többszöri betöltését, és biztosítja a konzisztenciát.

Példa a ClassLoader lekérésére:

// System ClassLoader lekérése
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

// Az Object osztály ClassLoaderének lekérése
ClassLoader objectClassLoader = Object.class.getClassLoader();

Egyedi ClassLoader létrehozása:

Saját ClassLoader-t hozhatsz létre, öröklődve a ClassLoader-ből, hogy osztályokat töltsön be nem szabványos forrásokból vagy speciális betöltési logikát alkalmazzon.

// Egyszerű példája egy egyedi ClassLoader-nek (bemutató céljából)
class CustomClassLoader extends ClassLoader {

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // Valós forgatókönyvben itt olvasnád a bytekódot
        throw new ClassNotFoundException(name);
    }
}

A ClassLoader-ek fontosak a modularitás, biztonság és a dinamikus kód betöltés szempontjából Java-ban.