Java ClassLoader nedir?


174

Birkaç basit cümleyle, Java ClassLoader nedir, ne zaman kullanılır ve neden?

Tamam, bir wiki makalesi okudum. ClassLoader sınıfları yükler. TAMAM. Bu yüzden jar dosyaları ekleyip içe aktarırsam, bir ClassLoader işi yapar.

Neden bu ClassLoader ile uğraşmalıyım? Hiç kullanmadım ve var olduğunu bilmiyordum.

Soru şu ki, ClassLoader sınıfı neden var? Ve ayrıca, pratikte nasıl kullanıyorsunuz? (Vakalar var, biliyorum.)


Sorunuzu daraltırsanız daha iyi sonuçlar elde edersiniz, örn. Anlamadığınız belirli bir kısmı işaret ederek, bunun aşina olduğunuz başka bir dil ile nasıl ilişkilendiğini vb.
JRL

75
Bu, kavramı açıklamak için birkaç basit cümle arayan birinin bakış açısından bakıldığında tamamen makul bir sorudur
oxbow_lakes

Yanıtlar:


231

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


47

Çoğu Java geliştiricisinin sınıf yükleyicilerini (JAR'larda paketlendiğinde hala çalışabilmesi için kaynakları yüklemek dışında) asla kullanması gerekmez.

ClassLoaders, büyük sistemlerde ve sunucu uygulamalarında aşağıdakileri yapmak için kullanılır:

  • Bir sistemi modüle etme ve çalışma zamanında modülleri yükleme, boşaltma ve güncelleme
  • Bir API kütüphanesinin (ör. XML ayrıştırıcı) farklı sürümlerini paralel olarak kullanın
  • Aynı JVM içinde çalışan farklı uygulamaları izole edin (örneğin statik değişkenler yoluyla birbirleriyle etkileşmemelerini sağlayın)

29

Soru "Bu ClassLoader sınıfını neden rahatsız etmek gerekir?"

Eh, çoğunlukla yanlış giderse bir şeyleri düzeltebilirsiniz :-).

Doğru, sadece bir uygulama yazdığınız sürece, bir JAR'a derleyin ve belki de birkaç ekstra kütüphane JAR'ı ekleyin, sınıf yükleyicileri bilmeniz gerekmez, sadece işe yarayacaktır.

Yine de, sahne arkasında neler olduğunu daha iyi anlamak için sınıf yükleyicileri ve sınıf yüklemesi hakkında biraz bilgi sahibi olmak faydalıdır. Örnek olarak, bir sınıf yüklendiğinde "statik başlatıcılar" çalışacaktır, bu yüzden ne zaman çalışacaklarını anlamak için sınıf yükleyicinin bunları ne zaman yükleyeceğine nasıl karar vereceğini bilmeniz gerekir.

ayrıca .. pratikte nasıl kullanıyorsunuz?

Basit durumlar için onlara ihtiyacınız yoktur. Bununla birlikte, kodu çalışma zamanında açık denetim ile dinamik olarak yüklemeniz gerekiyorsa (örn. Ağ üzerinden yükleme, derleme zamanında bulunmayan eklentileri yükleme, vb.), Daha fazlasını yapmanız gerekebilir. Sonra kendi sınıf yükleyicinizi yazabilirsiniz. Bağlantılar için diğer yanıtlara bakın.


14

ClassLoaderJava'da sınıf dosyalarını Java'ya yüklemek için kullanılan bir sınıftır. Java kodu javacderleyici tarafından sınıf dosyasına derlenir ve JVM sınıf dosyasında yazılan bayt kodlarını çalıştırarak Java programını yürütür.

ClassLoader, sınıf dosyalarını dosya sistemi, ağ veya başka bir kaynaktan yüklemekle sorumludur. Java, Bootstrap , Extension ve System veya Application sınıfı yükleyicide kullanılan üç varsayılan sınıf yükleyici vardır.

ClassLoader


ClassLoader nasıl çalışır?

## JVM ile ClassLoader etkileşimi resim açıklamasını buraya girin

Diğer @: nasıl classloader-çalışır-in-java.html


6

Sınıf Yükleyiciler, '.class' dosyasından veya ağ üzerinden Öbek'teki Yöntem Alanına sınıf verilerini yükleyen JVM'nin işlevsel bir bileşenidir.

JVM'nin ayrılmaz bir parçası gibi görünüyor, ancak bir java kullanıcısı olarak neden endişelenmeliyim? İşte nedeni:

Her sınıf yükleyicinin kendi ad alanı vardır ve belirli bir sınıf yükleyicisi tarafından çağrılan sınıflar kendi ad alanına girer.

İki farklı sınıf yükleyici tarafından çağrılan sınıfların birbirleri üzerinde görünürlüğü olmayacak ve bu da gelişmiş güvenlik ile sonuçlanacaktır.

Sınıf yükleyici ana çocuk temsil mekanizması java api sınıflarının yetkisiz kod tarafından hiçbir zaman saldırıya uğratılmamasını sağlar.

Ayrıntılar için buraya bakın


1

Sınıf yükleyicileri hiyerarşiktir. Sınıflar, JVM'de zaten çalışmakta olan bir sınıfta adlarıyla referans verildiği için JVM'ye tanıtılır.

Birinci sınıf nasıl yüklendi?
İlk sınıf, sınıfınızda static main()bildirilen yöntem yardımıyla yüklenir . Daha sonra yüklenen tüm sınıflar, önceden yüklenmiş ve çalışır durumda olan sınıflar tarafından yüklenir.

Sınıf yükleyici bir ad alanı oluşturur. Tüm JVM , primordial (veya bootstrap) sınıfı yükleyici olarak adlandırılan JVM içine gömülmüş en az bir sınıf yükleyici içerir . Bu bir şey ve ilkel olmayan sınıf yükleyicilere bakacağız. JVM, kullanıcı tanımlı sınıf yükleyicilerin primordial sınıf yükleyici yerine kullanılmasına izin vermek için kancalara sahiptir. İşte JVM tarafından oluşturulan sınıf yükleyiciler.

Bootstrap (primordial) Bu sınıf yükleyici yüklenemez. JDK iç sınıflarını, java. * Paketlerini yükler (genellikle rt.jar ve i18n.jar yükler). Extesions Bu sınıf yükleyici yüklenemez. Jar dosyalarını JDK uzantıları dizininden yükler (genellikle JRE'nin lib / ext'i). Sistem Bu sınıf yükleyici yüklenemez. Sınıfları sistem sınıfı yolundan yükler.

http://www.sbalasani.com/2015/01/java-class-loaders.html


1

ClassLoader sınıfının neden var olduğunu sorduğunuzda, bunun nedeni oldukça basittir - çalışma zamanında sınıf dosyalarını bulmak ve yüklemekle sorumlu sınıftır .

Hadi ayrıntılara girelim.

JVM'de, her Sınıf bir örneği tarafından yüklenir java.lang.ClassLoader. Her zamanki Java program başlatma java <classname>komutunuz tarafından yeni bir JVM başlatıldığında , ilk adım, düzgün çalışma java.lang.Objectve diğer çalışma zamanı sınıfları ( rt.jar) gibi gerekli tüm anahtar sınıfları belleğe yüklemektir .

Şimdi, ClassLoader için aslında 3 bölüm var:

  • BootstrapClassLoaderBellekte bu sınıflar mevcut yani yüklemek tüm sınıfları yapmak için sorumludur.

  • Bir sonraki görev, uygulamanın düzgün çalışması için harici kütüphaneleri / JAR'ları belleğe yüklemektir. ExtClassLoaderBu görev sorumludur. Bu sınıf yükleyici, java.ext.dirs yolunda belirtilen tüm .jar dosyalarının yüklenmesinden sorumludur.

  • Üçüncü ve ana önemli sınıf yükleyici AppClassLoader. Java.class.path system özelliğinde belirtilen sınıf dosyalarının yüklenmesinden uygulama sınıfı yükleyicisi sorumludur.

Ayrıca, varsayılan ClassLoader uygulamalarının geçersiz kılınabileceğini ve JVM'yi kullanışlı ve ilginç bir şekilde özelleştirebilmenizi sağlayarak sınıf dosyalarının sisteme nasıl getirileceğini tamamen yeniden tanımlamanıza izin vermeniz gerektiğini unutmayın.

resim açıklamasını buraya girin

Java Class Loader hakkında daha fazla bilgi edinmek için göz atın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.