ProgramlamaJava geliştirici

Java'daki ClassLoader nedir, hangi türleri vardır ve ana görevleri nelerdir? ClassLoader'lar sınıf izolasyonunu ve uyumluluk sorunlarını nasıl etkiler?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • Bootstrap ClassLoader — sistem yükleyicisi, JVM'nin temel sınıflarını (rt.jar) yükler.
  • Extension ClassLoaderjre/lib/ext yolundan genişletmeleri yükler.
  • System (Application) ClassLoader — uygulama sınıflarını classpath'ten yükler.
  • Custom ClassLoader — modülerlik, sıcak dağıtım, eklentiler için yararlı kullanıcı tanımlı yükleyicilerdir.

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); } }

Kandırmaca Soru

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.


Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri


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ı.