2009-09-16 29 views
12

Eski bir çerçeve için bazı birim testlerini uygulamaya çalışıyorum. Veritabanı katmanını taklit etmeye çalışıyorum. Ne yazık ki çerçevemiz biraz eski ve iyi uygulamaları kullanmıyor, bu yüzden endişelerin net bir şekilde ayrılması söz konusu değil. Veritabanı katmanını taklit etmeye çalışmak, JVM yükünü bile kullanılmayacak çok sayıda sınıf oluşturabileceğinden endişe ediyorum.Bir ClassLoader'ın hangi sınıflara yüklendiğini öğrenmenin bir yolu var mı?

Sınıf yükleyicilerini gerçekten anlamıyorum, bu sorun olmayabilir. Belirli bir ClassLoader'ın kaputun altında olup biteni kanıtlamak için yüklediği tüm sınıflarda zirveye ulaşmanın bir yolu var mı?

+0

"JVM'yi bile kullanılmayacak çok sayıda sınıf yüklemesi" nasıl alay ediyordu? –

cevap

15

java -verbose 

kullanarak çıkışı çok büyük miktarda üretmek Will uyardı. Çıkışı bir dosyaya kaydedin ve grep'i kullanın. Eğer 'tee' filtreyi varsa bu deneyebilirsiniz:

java -verbose | tee classloader.log 
grep class classloader.log 
2

Emin değilim. Ama yapabileceğimin bir yolu var. Belki de aşırı gülünç olsa da. Yönleri deneyebilir ve loadclass için bir nokta kesebilirsin. Ayrıca belki de jvm argüman -verbose belki yardımcı olabilir.

35

Kendi Classloader'ınızı oluşturabilir ve birim testi sırasında yüklemek için bunu kullanabilirsiniz. Kendi özel Classloader'ınızın yaptıklarını yazdırmasını sağlayın.

Ya da sadece sınıflar yüklendiği bilmek istiyorsanız, yapın:

java -verbose:class 
1

alternatif bir yol olarak, belirtildiği gibi, belirli bir sınıf-yükleyici için, bu kod parçacığını kullanabilirsiniz. Sadece isterseniz obj değişkeninin değerini değiştirin.

Object obj = this; 
ClassLoader classLoader = obj.getClass().getClassLoader(); 
File file = new File("classloderClasses.txt"); 
if (file.exists()) { 
    file.delete(); 
} 
if (classLoader != null) { 
    try { 
     Class clClass = classLoader.getClass(); 
     while (clClass != ClassLoader.class) { 
      clClass = clClass.getSuperclass(); 
     } 
     java.lang.reflect.Field classesField = clClass.getDeclaredField("classes"); 
     classesField.setAccessible(true); 
     Vector classes = (Vector) classesField.get(classLoader); 
     FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true); 
     fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes()); 
     fos.write(Arrays.toString(classes.toArray()).getBytes()); 
     fos.close(); 
    } catch (Exception exception) { 
     exception.printStackTrace(); 
     // TODO 
    } 
} 
İlgili konular