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
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: YaniClass.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önlendirmeInvocationHandler
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.
getProxyClass
bu şekilde uygulamış olabilir, ama biz (bir ebeveyn olarak belirtilen biriyle) Yeni bir classloader oluşturmanız gerekir
bir. VM
- 1. ClassLoader şey
- 2. Özel ClassLoader nasıl kullanılır?
- 3. Bu senaryoda classLoader sınıfları
- 4. ClassLoader loadClass eseridir nedir()
- 5. JDK1.7 ClassLoader Bellek Sızıntısı
- 6. ClassLoader getResourceAsStream (Eclipse) boş
- 7. RMI çağırma ile ClassLoader
- 8. Guice 3.0 + Tomcat 7.0 = ClassLoader bellek sızıntısı
- 9. SpatialPointsDataFrame'i SpatialLinesDataFrame ürününe dönüştürün R
- 10. InputStream, ProcessBuilder ürününe nasıl yollanır
- 11. başka bir ProcessBuilder ürününe bağlanması
- 12. Çift Düzeni UIImage ürününe dönüştürebilir
- 13. taskdef class com.android.ant.SetupTask, classloader AntClassLoader []
- 14. ClassLoader iş parçacığı güvenli midir?
- 15. imeActionId ürününü ne yerleştirmeliyim?
- 16. QNetworkAccessManager ürününü Qt
- 17. System.Type ürününü XAML
- 18. Django Rest Framework ürününü
- 19. Microsoft.Owin.Hosting.WebApp ürününü atma 'System.ObjectDisposedException'
- 20. QLabel QStatusBar ürününü Qt Designer
- 21. Değişken sayıda dizinin ürününü bulmak
- 22. Belirli bir kullanıcının PrintQueue ürününe iş ekleme
- 23. Django'da bir ChoiceField ürününe nasıl "sınıf" ekleyebilirim?
- 24. Tanımlanmamış yönteme çağrı Composer \\ Autoload \\ ClassLoader :: setPsr4()
- 25. HTTP: Aralık desteklenmediğinde "Range: bytes =" öğesine nasıl yanıt vermeliyim?
- 26. Bir UINavigationViewController ürününü kendi başına kullanarak
- 27. R data.frame ürününü sütununa göre listeletir
- 28. Bir System.Timers.Timer ürününü nasıl güvenle atabilirim?
- 29. Geçerli ApplicationUser ürününü mizanpaj görünümüne getirin
- 30. Npm DevDependencies ürününü ayrı dizine kurun
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
'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.) –