Java Academy · Lektion

ClassLoader-hierarki och egna laddare

Förstå bootstrap-, plattforms- och applikationsladdare och skriv en egen ClassLoader.

Lektion 2 av 413 steg

ClassLoader-hierarki och egna laddare är en gratis lektion i Java Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Java Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Java Academy innehåller totalt 4 lektioner.

ClassLoader-hierarkin

JVM använder en hierarki av ClassLoader-objekt. Varje laddare har en förälder; innan den själv laddar en klass delegerar den till föräldern (modellen med delegering till föräldern först).

Bootstrap ClassLoader

Bootstrap ClassLoader laddar JDK:s kärnklasser (java.lang.*, java.util.*). Den är implementerad i native-kod och har ingen Java-förälder; getParent() returnerar null.

ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)

Platform ClassLoader (Java 9+)

Platform ClassLoader (tidigare Extension ClassLoader) laddar moduler från JDK som inte ingår i bootstrap-uppsättningen (java.sql, java.xml med flera). Dess förälder är bootstrap-laddaren.

ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoader

Application (System) ClassLoader

Application ClassLoader laddar applikationsklasser från classpath (-cp / CLASSPATH). Dess förälder är Platform ClassLoader. Det är standardladdaren för användarkod.

ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoader

Delegering med föräldern först

När com.example.MyService laddas frågar AppClassLoader först sin förälder (Platform), som frågar Bootstrap. Först om ingen av föräldrarna kan ladda den försöker barnet ladda den själv.

Klassidentitet och ClassLoader-objekt

Två klasser med samma namn som laddas av olika ClassLoader-objekt betraktas som olika typer. Att casta mellan dem kastar ClassCastException – viktigt i plugin-system och OSGi.

// Loaded by two different loaders → different Class objects
Class<?> c1 = loader1.loadClass("com.example.Plugin");
Class<?> c2 = loader2.loadClass("com.example.Plugin");
System.out.println(c1 == c2); // false!

Skriva en egen ClassLoader

Utöka ClassLoader och åsidosätt findClass(String name). Läs bytekod från en anpassad källa (krypterad JAR, nätverk, databas) och anropa defineClass.

public class EncryptedClassLoader extends ClassLoader {
    public EncryptedClassLoader(ClassLoader parent) { super(parent); }
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] bytes = decrypt(readBytecodeFromVault(name));
        return defineClass(name, bytes, 0, bytes.length);
    }
}

URL ClassLoader: läsa in från JAR-filer

URLClassLoader laddar klasser från en lista med URL:er (filsökvägar eller HTTP-URL:er). Användbart för plugin-system som lägger till JAR-filer under körning.

URL[] urls = { new File("plugins/my-plugin.jar").toURI().toURL() };
try (URLClassLoader loader = new URLClassLoader(urls, getClass().getClassLoader())) {
    Class<?> cls = loader.loadClass("com.example.PluginImpl");
    Plugin plugin = (Plugin) cls.getDeclaredConstructor().newInstance();
    plugin.start();
}

Stänga ClassLoader-objekt

Stäng alltid URLClassLoader när den inte längre används – den håller JAR-filer öppna. När den stängs kan JAR-filerna raderas eller uppdateras. Använd try-with-resources.

Delegering med barnet först (isolerad inläsning)

Vissa containrar (Tomcat, Spring Boot fat JAR) vänder på hierarkin: barnladdaren försöker först och återgår till föräldern endast om klassen inte hittas. Detta isolerar biblioteksversioner mellan webbapplikationer.

ClassLoader-läckor

En klassladdare kan samlas in av GC endast när ingen klass som den har laddat längre kan nås. Statiska fält som håller objekt från en laddad klass vid liv håller även laddaren vid liv – en vanlig läcka vid redeploy.

Snabbkontroll

Vad gör en ClassLoader innan den försöker ladda en klass själv?

Sammanfattning

Hierarki i tre nivåer: Bootstrap → Platform → Application. Delegering till föräldern först förhindrar duplicering av klasser. Egna laddare åsidosätter findClass. Använd URLClassLoader för plugin-system. Stäng laddarna för att förhindra läckor.

Gratis att börja

Lär dig Java med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
104
Lektioner
374

Vanliga frågor

Är lektionen ”ClassLoader-hierarki och egna laddare” gratis?

Ja – hela texten till ”ClassLoader-hierarki och egna laddare” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Java Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Java Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”ClassLoader-hierarki och egna laddare”?

Förstå bootstrap-, plattforms- och applikationsladdare och skriv en egen ClassLoader. Ni övar på Java Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Java Academy?

Du behöver inga förkunskaper. Utbildningen i Java Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”ClassLoader-hierarki och egna laddare”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Java Academy-lektionen?

Ja. Varje Java Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Faser vid klassinläsning: Load, Link, Initialize
  2. ClassLoader-hierarki och egna laddare
  3. Inspektera bytekod med javap
  4. JIT-kompilering och nivåindelad kompilering
← Tillbaka till Java Academy