2011-03-29 15 views
9

Belgeleri okudum, ancak hala hangi classloader'ın argüman olarak vermem gerektiğini anlamıyorum. Birkaç seçenek denedim, ancak bu, derleme veya vekil davranışı üzerinde hiçbir etkisi yok gibi görünüyor. null dahil olmak üzere sınıf yükleyici argümanı olarak herhangi bir şey iletebileceğim biraz rahatsız edici ve kod hala iyi çalışıyor. Bunu herkes açıklayabilir mi ve sınıf yükleyicisi için kötü bir argüman sağlarsam nasıl bir hata ortaya çıkabilir? Java ya da genel olarak bir sınıf yükleyicinin ne olduğu konusunda güçlü bir sezgisel fikre sahip olmadığımı eklemeliyim.Proxy.newProxyInstance (...) ürününe hangi ClassLoader ürününü vermeliyim?

cevap

6

Her sınıfın bir sınıf yükleyicisi olması gerekir, bu yüzden burada bir tane vermeliyiz.

arayüz tiplerinin tümü belirtilen sınıf yükleyici ile adıyla görünür olmalıdır:

önemli bir bölümü, bu (the documentation for getProxyClass() gösterilmiştir). Başka bir deyişle, sınıf yükleyici cl ve her arayüzde i için aşağıdaki ifade doğru olması gerekir: Yani

Class.forName(i.getName(), false, cl) == i 

, onun ana classloaders birini (veya daha fazla) verilen tanımlanmış herhangi classloader kullanabilirsiniz arabirimleri. o zaman kullanılan hangi classloader önemli olmamalı -

sizin durumunuzda null çalışır, ben senin arayüzleri de null sınıf yükleyici (önyükleme yükleyicisi) olduğunu varsayalım edin. Bilmediğiniz arayüzlerden bir proxy oluşturmanız gerekiyorsa, verilen ilk arayüzün classloader'ını alın ve arayanın garip bir şey yapmadığını umuyoruz.

Neden gerekli?

Böyle hayal edebilirsiniz: Tüm arabiriminin tüm yöntemleri uygulayan yeni bir sınıf için bazı bayt kodu (henüz yoksa)

  • getProxyClass() yöntem oluşturur (her biri sadece yönlendirme InvocationHandler numaralı telefonu arayın.
  • Bu bayt kodu, belirttiğiniz sınıf yükleyicinin defineClass yöntemine iletir.
  • Bu baytkodda, tüm arabirimlerinize isim verilir ve bu arabirimleri çözümlemek için VM şu andaki forName numaralı çağrıyı kullanır.
yerine mevcut bir yeniden edememek bunun için Biz herhangi bir VM büyü olmadan saf Java bu getProxyClass bu şekilde uygulamış olabilir, ama biz (bir ebeveyn olarak belirtilen biriyle) Yeni bir classloader oluşturmanız gerekir

bir. VM

+0

teşekkür :-) burada iç büyü kullanabilir beri

Gerçekte, bu sentetik sınıf için gerçek bir baytkodu olmayabilir, hala classloader ne yaptığını öğrenmek için sezgi yok . Bundan biraz bahseder misin? Hala bir sınıf yükleyicisinin, bir şey yapmadan sorumlu bir yükleyicinin neden sorumlu olabileceğini anlamakta hala zorlanıyorum. Yanlış bir yükleyicinin verildiği bir oyuncak örneği olabilir mi? – jonderry

+0

'null' classloader, 'classst,' Object', 'ClassLoader' gibi, çekirdek sınıflarını yükleyen classloader' 'bootstrap classloader' 'dir. Sanal makine tarafından yerel olarak uygulanır ve bir ClassLoader nesnesine sahip değildir. (Sınıf tarafından kullanılır.forName 'null'ı" ClassLoader "argümanı olarak verirseniz, örneğin). (Örnek daha sonra gelecek.) –

İlgili konular