2009-09-16 14 views
12

Próbuję zaimplementować niektóre testy jednostkowe dla starego frameworka. Próbuję wyśmiewać warstwę bazy danych. Niestety nasza struktura jest nieco stara i nie wykorzystuje najlepszych praktyk, więc nie ma wyraźnego oddzielenia obaw. Trochę się martwię, że próba wyłudzenia warstwy bazy danych może spowodować, że JVM załaduje ogromną liczbę klas, które nawet nie będą używane.Czy istnieje sposób na sprawdzenie, które klasy załadowała usługa ClassLoader?

Nie do końca rozumiem klasy ładujące klasy, więc nie stanowi to problemu. Czy istnieje sposób na zdobycie szczytu we wszystkich klasach, które załadował konkretny ClassLoader, aby udowodnić, co dzieje się pod maską?

+0

W jaki sposób kpiny "sprawiają, że JVM ładuje ogromną liczbę klas, które nawet nie będą używane"? –

Odpowiedz

15

Ostrzegamy, że za pomocą

java -verbose 

będzie produkować ogromne ilości mocy. Zapisz dane wyjściowe do pliku, a następnie użyj polecenia grep. Jeśli masz filtr „tee” można spróbować to:

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

Nie jestem pewien. Ale jest jeden sposób, w jaki widzę, że można to zrobić. Może jednak przesadnie absurdalne. Możesz wypróbować aspekty i umieścić punkt dla klasy obciążenia. Być może pomocne mogą być argumenty jvm -verbose.

35

Możesz stworzyć swój własny Classloader i użyć go do załadowania podczas testu urządzenia. Niech Twój niestandardowy Classloader wydrukuje to, co robi.

Lub jeśli po prostu chcesz wiedzieć, które klasy są ładowane, należy:

java -verbose:class 
1

Jako alternatywny sposób dla danej klasy loader, jak wspomniano, można użyć tego fragmentu kodu. Po prostu zmień wartość zmiennej obj, jeśli chcesz.

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 
    } 
} 
Powiązane problemy