2011-05-20 16 views
5

Sorun: Uygulamam üçüncü bir kütüphanenin uyumsuz sürümlerini kullanan iki kitaplık kullanmaktadır. Birisi sınıf izolasyonu için herhangi bir yöntem biliyor mu?Aynı tam adı ile iki anlaşılmaz sınıf nasıl kullanılır?

Sınıf yükleyici duymuşsunuzdur ama, nasıl yardım edebileceklerini anlamıyorum - biz sınıfın bir sürümünü yüklemek eğer, başka yükleyemiyorum - sınıf zaten yüklenir?

Ayrıca baharı düşünüyorum ama böyle bir yalıtım sağlayıp sağlamadığını bilmiyorum.

+0

Bu iki sınıfı ayrı ad alanlarında değil mi? –

+0

Java bağlamında "ad alanı" ne anlama geldiğini anlamıyorum. Bir paket ismi? Önemli ise, farklı paketlerde olmalarına izin verin. – Nulldevice

+0

Üzgünüz, evet, paketler demek istedim. Ayrıca, sorunuzu yanlış anladım, bu yüzden alakalı olduğunu düşünmüyorum! –

cevap

1

sormak, başka yükleyemiyor - sınıfı zaten yüklü mü?

Doğru değil. Sınıf yükleyici, sınıfın kimliğinin bir parçası olarak kabul edilir. Farklı bir sınıf yükleyici tarafından yüklenmişse, farklı bir sınıf olarak kabul edilir.

+0

Bu, java nesneleri olarak sınıfları idare edebileceğimiz anlamına mı geliyor? Örneğin, bunları dizi veya liste haline getirin veya daha sonra bir örnek oluşturun? – Nulldevice

+1

@Nulldevice Sınıfları yalnızca sınıf kodlayıcılar tarafından bayt koduyla örneklenebilir. Ancak, evet, onlar nesnelerdir ve dizilere veya listelere yerleştirilebilirler. Ben sadece ClassLoader'ların böyle şeyler yapması gerektiğini düşünüyorum. –

2

SınıfYükleyiciler temel olarak JVM'deki sınıflara anlam veren öğelerdir. JVM'deki kökler için bir hiyerarşi oluştururlar ve java sınıflarını yüklerler. ApplicationClassLoader, uygulamanızın tüm sınıflarını yüklediğinden, göz önünde bulundurmanız gereken ilk ClassLoader'dır.

Bir sınıf yüklendiğinde, diğer sınıflara tüm referanslar çözülmüş ve sınıflar yüklenir tez vardır. JVM, varsayılan olarak, sınıf yükleyicilerinin, daha önce bir sınıf yüklemiş olsalar bile, daha önce ebeveynlerine sordukları bir sistem sağlar. Değilse, onlar uygulama classloader onlar 2 farklı classloader yaşıyorsanız

İki sınıf izole edilebilir onların sınıf yolunda aramak değil,. Yapması zor değil. Ebeveynini ve sınıf yolunu (bytecode'un bulunduğu yer) belirlerken bir sınıf yükleyicisi (URLClassLoader gibi) oluşturmanız gerekir. Bu durumda, bir sınıf yüklemesini söylersiniz. Ebeveynine soracaktır ve eğer sınıf henüz yüklenmemişse, sınıf yolunu arayacak ve yükleyecektir. Aynı üst öğeye eklenmiş başka bir sınıf yükleyicisi oluşturursanız, ilk tarafından yüklenen sınıflar, kardeş oldukları için hiçbir zaman saniyeler içinde görülmez. Ve ikinci kutu

Uygulama Sunucuları uygulamalar arasında dürüst bir izolasyon olması heyet başka bir form kullanmak oldukça iyi yalıtım var herhangi bir sorun

olmadan aynı isimde bir sınıf yükler. Sınıfta bir sürümünü yükleyecektir eğer örnek, URLClassLoader için, uzanan bir classloader yeniden tanımlamak ve öncelikle sınıf yolunda sınıflar aramak için başlatarak heyet süreci tersine çevirmek, daha sonra ebeveyn

-1

kütüphanelerin en az bir açık kaynak ve onlar bağlıdır kütüphane açık kaynak, classloaders ile uğraşmaktansa gerek ise. Sadece tüm paketlerin bağlı olduğu kütüphanenin sürümlerinden birinde yeniden adlandırın, bu paketlere başvuran tüm kodların da değiştirildiğinden emin olun. Hey presto - isim çatışması yok. Sun'ın arkasında Xerces ve Xalan'ı dahil ettiklerinde Sun'ın aslında JDK için yaptığı şey buydu.

+0

~ 50 yazılım mühendisleri tarafından geliştirilen bir proje olduğunu söylersem ne olur? Binlerce satır kodun hatalarının giderilmesinden sorumlu olmak istemiyorum. Bazı kütüphanelerin sürümlerini açık kaynaklı bile olsa değiştirmek kolay değildir. – Nulldevice

+0

Sadece gerekli yeniden adlandırmaları yapan bir betik yazabilir ve bu senaryoyu yayımlanan her yeni sürümde çalıştırabilirsiniz. 'Class.forName' için dikkat edin, ancak nispeten basit olmalıdır. –

+0

Efendim, on binlerce kod satırı var - şaka mı yapıyorsunuz? – Nulldevice

İlgili konular