2011-03-21 11 views
11

Şimdiye kadar, özel ClassLoaders için gördüğüm örnekler URLClassLoader alt sınıflarını içerir ve kaynakları sınıflara yüklemek için bu özel örneği kullanır.Kavanozlar İçeren Kavaklarda Sınıflar İçin Yedek Sistem Sınıflandırıcı

SystemClassLoader'ı değiştirmek için alternatif yöntemler aramak için boş yere denedim, böylece ClassLoader'ım sınıf yolunda bulunmayan sınıflar için istişare edilebilir.

Thread.currentThread().setContextClassLoader'u denedim, ancak çalışmıyor gibi görünüyor.

Bu mümkün mü? java.system.class.loader özelliğiyle

+0

"Sınıf yolunda bulunmayan sınıflar için ClassLoader'ma danışılabilsin diye" derken, "java.lang. *" Gibi normal sistem sınıflarını mı kastediyorsunuz, yoksa 3. parti sınıflarını yüklemek için mi demek istiyorsunuz? – Pacerier

+0

üçüncü taraf sınıfları ... – Olaseni

cevap

8

çalıştırın JVM:

java -Djava.system.class.loader=myClassLoader myApplication 
+3

JVM komut satırını değiştirmeyi engelleyen bir çözüm arıyorum – Olaseni

+0

Sistem sınıf yükleyicisini değiştirmek isterseniz böyle bir çözüm yok. Özel sınıf yükleyicinizde kod oluşturabilir ve sınıfları yüklemek için kullanabilirsiniz, ancak sistem sınıf yükleyicisi olmayacaktır. Genellikle tescilli sınıf yükleyicisi yaratmak çoğu vaka için yeterli bir çözümdür. – Tarlog

11

bu eski bir soru olmasına rağmen, aslında sistem ClassLoader değiştirmek için bir yolu yoktur. Bununla birlikte, pazarlık ettiğinizden daha fazlasını alabilirsiniz.

 Field scl = ClassLoader.class.getDeclaredField("scl"); // Get system class loader 
     scl.setAccessible(true); // Set accessible 
     scl.set(null, new YourClassLoader()); // Update it to your class loader 

Bu, Oracle JVM üzerinde çalışmalıdır.

+2

Bu tabii ki, java sürümleri arasında değişebilen bir özel değişkeni bağlı olarak bir kesmek, ancak bir sınıf yüklemek için System.getClassLoader() çağırır bir üçüncü taraf bağımlılık tek jar ve kod ile ilgili sorunları etrafında çalışmama izin verdi . Bir kavanozun sınıf yükleyicisini iliklerine kadar iterek. Çalışmamı bitirdikten sonra – Gus

+0

@Xyene - classloader'ı URLClassLoader.getSystemClassLoader() öğesine geri yüklediğimde uygulama davranışı iyi olacak mı? – ha9u63ar

+0

@ ha9u63ar Sanırım kullanım durumunuza göre değişir; Dikkatli değilseniz, sınıflarınızın görünürlük sorunları olması muhtemeldir (örn. sistem sınıf yükleyicisinden yüklenen A sınıfı, B sınıfını sizininkinden göremeyecektir). Böyle bir şey yaptığımdan birkaç yıl geçti, ancak sistem yükleyiciyi geri yüklemek için bir fayda olmayabilir. – Xyene