Hierarki ClassLoader dan Pemuat Kustom
Pahami pemuat class bootstrap, platform, dan aplikasi, lalu tulis ClassLoader kustom.
Hierarki ClassLoader dan Pemuat Kustom adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
Hierarki ClassLoader
JVM menggunakan hierarki ClassLoader. Setiap pemuat memiliki induk; sebelum memuat kelas sendiri, pemuat tersebut mendelegasikan tugas kepada induknya (model delegasi induk-terlebih dahulu).
ClassLoader Bootstrap
ClassLoader bootstrap memuat kelas inti JDK (java.lang.*, java.util.*). ClassLoader ini diimplementasikan dalam kode asli dan tidak memiliki induk Java; getParent() mengembalikan null.
ClassLoader cl = String.class.getClassLoader();
System.out.println(cl); // null (bootstrap ClassLoader)ClassLoader Platform (Java 9+)
ClassLoader Platform (sebelumnya ClassLoader Ekstensi) memuat modul dari JDK yang tidak termasuk dalam kumpulan bootstrap (java.sql, java.xml, dan sebagainya). Induknya adalah ClassLoader bootstrap.
ClassLoader platform = ClassLoader.getPlatformClassLoader();
System.out.println(platform.getClass().getName());
// jdk.internal.loader.ClassLoaders$PlatformClassLoaderClassLoader Aplikasi (Sistem)
ClassLoader Aplikasi memuat kelas aplikasi dari jalur kelas (-cp / CLASSPATH). Induknya adalah ClassLoader Platform. ClassLoader ini merupakan pemuat bawaan untuk kode pengguna.
ClassLoader app = ClassLoader.getSystemClassLoader();
System.out.println(app.getClass().getName());
// jdk.internal.loader.ClassLoaders$AppClassLoaderDelegasi Induk-Terlebih Dahulu
Saat memuat com.example.MyService, AppClassLoader terlebih dahulu meminta induknya (Platform), yang kemudian meminta Bootstrap. Hanya jika tidak ada induk yang dapat memuatnya, pemuat anak akan mencoba memuatnya sendiri.
Identitas Class dan ClassLoaders
Dua kelas dengan nama yang sama tetapi dimuat oleh ClassLoader yang berbeda dianggap sebagai tipe yang berbeda. Pengecoran di antara keduanya melempar ClassCastException — hal penting dalam sistem plugin dan 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!Menulis ClassLoader Kustom
Perluas ClassLoader dan timpa findClass(String name). Baca kode bita dari sumber kustom (JAR terenkripsi, jaringan, basis data), lalu panggil 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: Memuat dari JAR
URLClassLoader memuat kelas dari daftar URL (jalur berkas atau URL HTTP). ClassLoader ini berguna untuk sistem plugin yang menambahkan JAR saat berjalan.
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();
}Menutup ClassLoaders
Selalu tutup URLClassLoader setelah selesai — ClassLoader ini membuat JAR tetap terbuka. Menutupnya memungkinkan JAR dihapus atau diperbarui. Gunakan try-with-resources.
Delegasi Anak-Terlebih Dahulu (Pemuatan Terisolasi)
Beberapa kontainer (Tomcat, JAR lengkap Spring Boot) membalik hierarki: pemuat anak mencoba terlebih dahulu, lalu beralih ke induk hanya jika kelas tidak ditemukan. Hal ini mengisolasi versi pustaka di antara aplikasi web.
Kebocoran ClassLoader
Pemuat kelas hanya dapat dibersihkan oleh pengumpul sampah jika tidak ada kelas yang dimuat olehnya yang masih dapat dijangkau. Atribut statis yang menyimpan objek dari kelas yang dimuat membuat pemuat tetap aktif — kebocoran yang umum terjadi saat penerapan ulang.
Pemeriksaan Singkat
Apa yang dilakukan ClassLoader sebelum mencoba memuat kelas sendiri?
Ringkasan
Hierarki tiga tingkat: Bootstrap → Platform → Aplikasi. Delegasi induk-terlebih dahulu mencegah duplikasi kelas. ClassLoader kustom menimpa findClass. Gunakan URLClassLoader untuk sistem plugin. Tutup pemuat untuk mencegah kebocoran.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Hierarki ClassLoader dan Pemuat Kustom” gratis?
Ya — teks lengkap “Hierarki ClassLoader dan Pemuat Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Hierarki ClassLoader dan Pemuat Kustom”?
Pahami pemuat class bootstrap, platform, dan aplikasi, lalu tulis ClassLoader kustom. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Hierarki ClassLoader dan Pemuat Kustom” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Tahap Pemuatan Class: Memuat, Menautkan, Menginisialisasi
- Hierarki ClassLoader dan Pemuat Kustom
- Memeriksa Bytecode dengan javap
- Kompilasi JIT dan Kompilasi Bertingkat