ClassLoader — JVM'de, sınıfların bayt kodunu ilk kullanıldıklarında belleğe yüklemekle sorumlu özel bir bileşendir. Farklı kaynaklardan (dosya sistemi, ağ, arşiv vb.) sınıfları dinamik olarak yüklemeyi sağlar.
Sınıf yükleyici türleri:
jre/lib/ext yolundan genişletmeleri yükler.ClassLoader, delegasyonu uygular: önce sınıfı üst yükleyici (parent-first) ile yüklemeye çalışır, eğer başarılı olamazsa kendisi arar.
Sınıf izolasyonu: Her sınıf yükleyici kendi "görünürlük alanını" oluşturur. Farklı yükleyiciler tarafından yüklenen aynı isimdeki iki sınıf JVM içinde farklı türler olarak kabul edilir.
Kendi yükleyicinizin oluşturulması örneği:
class MyClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { // Sınıfın bayt kodunu arama ve yükleme kodunuz return super.findClass(name); } }
Farklı yükleyiciler tarafından yüklenen aynı isimdeki iki sınıf, JVM içinde bir sınıf olarak kabul edilebilir mi?
Cevap: Hayır! JVM bir sınıfı (sınıfın tam adı, sınıf yükleyicisi) çifti ile benzersiz olarak kabul eder. Bu nedenle, farklı yükleyiciler tarafından yüklenen aynı sınıflar farklı olarak kabul edilir.
Hikaye
Plug-in mimarisini destekleyen bir kurumsal uygulamada, eklentiler ayrı sınıf yükleyicileri tarafından yüklendi. Sonuç olarak, ana uygulama ile eklenti arasındaki bir nesnenin (PluginInterface) aktarımı, aynı arayüzün farklı yükleyiciler tarafından yüklenmesi nedeniyle ClassCastException hatasına neden oldu.
Hikaye
Özelleştirilmiş sınıf yükleyicisi kullanırken üst yükleyiciye delegasyon uygulanmadı. Bu, standart kütüphane sınıflarının yeniden yüklenmesine yol açtı ve bu da garip ClassCastException ve LinkageError hatalarına neden oldu.
Hikaye
Büyük bir Java EE sunucusunda, farklı uygulamalar aynı kütüphanenin farklı sürümlerini yükledi. Yükleyici zincirinin ayarındaki dikkatsizlik, uygulamalar arasında sınıfların çakışmasına neden oldu ve bu bir gün büyük bir bellek sızıntısına ve sürüm çatışmaları nedeniyle çöküşlere yol açtı.