Sun'ın bu güzel eğitiminden alınmıştır:
Motivasyon
C ve C ++ gibi statik olarak derlenmiş programlama dillerinde yazılmış uygulamalar, yerel, makineye özgü talimatlarda derlenir ve yürütülebilir bir dosya olarak kaydedilir. Kodun yürütülebilir bir yerel koda birleştirilmesi işlemine bağlantı adı verilir - yürütülebilir bir uygulama oluşturmak için ayrı olarak derlenmiş kodun paylaşılan kitaplık koduyla birleştirilmesi. Bu, Java gibi dinamik olarak derlenmiş programlama dillerinde farklıdır. Java'da, Java derleyicisi tarafından oluşturulan .class dosyaları Java Sanal Makinesi'ne (JVM) yüklenene kadar olduğu gibi kalır - başka bir deyişle, bağlantı işlemi JVM tarafından çalışma zamanında gerçekleştirilir. Sınıflar JVM'ye 'gerektiği gibi' yüklenir. Yüklü bir sınıf başka bir sınıfa bağlı olduğunda, o sınıf da yüklenir.
Bir Java uygulaması başlatıldığında, çalıştırılacak ilk sınıf (veya uygulamaya giriş noktası) main () adı verilen genel statik void yöntemine sahip sınıftır. Bu sınıf genellikle diğer sınıflara referanslar içerir ve başvurulan sınıfları yüklemeye yönelik tüm girişimler sınıf yükleyicisi tarafından gerçekleştirilir.
Bu özyinelemeli sınıf yüklemesi ve genel olarak sınıf yükleme fikri hakkında fikir edinmek için aşağıdaki basit sınıfı göz önünde bulundurun:
public class HelloApp {
public static void main(String argv[]) {
System.out.println("Aloha! Hello and Bye");
}
}
Bu sınıfı -verbose: class komut satırı seçeneğini belirterek çalıştırırsanız, hangi sınıfların yüklendiğini yazdırırsa, aşağıdaki gibi görünen bir çıktı alırsınız. Liste burada gösterilemeyecek kadar uzun olduğu için, bunun yalnızca kısmi bir çıktı olduğunu unutmayın.
prmpt>java -verbose:class HelloApp
[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]
Gördüğünüz gibi, önce uygulama sınıfı (HelloApp) için gereken Java çalışma zamanı sınıfları yüklenir.
Java 2 Platformundaki Sınıf Yükleyicileri
Java programlama dili, uygulama geliştiricilerinin hayatını her geçen gün daha kolay hale getirmek için gelişmeye devam ediyor. Bu, temel mekanizmaların uygulama detaylarından ziyade iş mantığına konsantre olmanızı sağlayarak hayatınızı kolaylaştıran API'ler sağlayarak yapılır. Bu, Java platformunun olgunluğunu yansıtmak için J2SE 1.5'in J2SE 5.0'a yakın zamanda değiştirilmesiyle açıktır.
JDK 1.2'den itibaren, JVM içine yerleştirilmiş bir bootstrap sınıfı yükleyici Java çalışma zamanı sınıflarını yüklemekle sorumludur. Bu sınıf yükleyicisi yalnızca önyükleme sınıfyolunda bulunan sınıfları yükler ve bunlar güvenilir sınıflar olduğundan, doğrulama işlemi güvenilir olmayan sınıflarda olduğu gibi gerçekleştirilmez. Bootstrap sınıfı yükleyiciye ek olarak, JVM'de standart uzantı API'larından sınıfları yüklemekle sorumlu bir uzantı sınıfı yükleyicisi ve uygulama sınıflarınızın yanı sıra genel sınıf yolundan sınıfları yükleyen bir sistem sınıfı yükleyicisi vardır.
Birden fazla sınıf yükleyici olduğundan, kökleri bootstrap sınıfı yükleyici olan bir ağaçta temsil edilir. Her sınıf yükleyicinin üst sınıf yükleyicisine bir referansı vardır. Sınıf yükleyiciden bir sınıfı yüklemesi istendiğinde, öğenin kendisini yüklemeye çalışmadan önce ana sınıf yükleyicisine danışır. Ebeveyn sırayla ebeveynine danışır ve böyle devam eder. Bu nedenle, ancak tüm üst sınıf yükleyicileri, geçerli sınıf yükleyicinin dahil olduğu sınıfı bulamazsa. Başka bir deyişle, bir delegasyon modeli kullanılır.
Java.lang.ClassLoader Sınıfı
java.lang.ClassLoader
JVM dinamik yükler sınıfları şekilde uzatmak için gereken uygulamalar ile sınıflandırma edilebilir soyut sınıftır. İçinde Kurucular java.lang.ClassLoader
(ve alt sınıfları) yeni bir sınıf yükleyici örneğini zaman bir üst belirtmek için izin verir. Açıkça bir üst öğe belirtmezseniz, sanal makinenin sistem sınıfı yükleyicisi varsayılan üst öğe olarak atanır. Başka bir deyişle, ClassLoader sınıfı, sınıfları ve kaynakları aramak için bir temsilci seçme modeli kullanır. Bu nedenle, her ClassLoader örneğinin ilişkili bir üst sınıf yükleyicisi vardır, böylece bir sınıf veya kaynak bulmanız istendiğinde, sınıf veya kaynağın kendisini bulmaya çalışmadan önce görev üst sınıf yükleyicisine devredilir. loadClass()
ClassLoader yöntemi, bir sınıfı yüklemek için adı sırayla, aşağıdaki görevleri gerçekleştirir:
Bir sınıf zaten yüklendiyse, sınıf döndürür. Aksi takdirde, yeni sınıf aramasını üst sınıf yükleyiciye devreder. Üst sınıf yükleyici sınıfı bulamazsa, sınıfı bulma ve yükleme loadClass()
yöntemini çağırır findClass()
. finalClass()
Mevcut sınıf yükleyici sınıf için arama yapar sınıfı üst sınıf yükleyici tarafından bulunmazsa.
Orijinal makalede, kendi ağ sınıfı yükleyicilerinizi nasıl uygulayacağınızı gösteren ve neden (ve nasıl) ile ilgili sorunuza cevap veren daha fazlası var. Ayrıca API belgelerine de bakın .