2009-09-16 12 views
12

Ich versuche, einige Unit-Tests für ein altes Framework zu implementieren. Ich versuche, die Datenbankebene zu verspotten. Leider ist unser Framework ein bisschen alt und verwendet nicht die besten Praktiken, so dass es keine klare Trennung von Bedenken gibt. Ich bin etwas besorgt, dass der Versuch, die Datenbankschicht zu verspotten, dazu führen könnte, dass die JVM eine große Anzahl von Klassen lädt, die nicht einmal verwendet werden.Gibt es eine Möglichkeit, welche Klassen ein ClassLoader geladen hat?

Ich verstehe nicht wirklich Klassenlader so gut, damit dies kein Problem sein könnte. Gibt es eine Möglichkeit, einen Höhepunkt in allen Klassen zu erreichen, die ein bestimmter ClassLoader geladen hat, um zu beweisen, was unter der Haube passiert?

+0

Wie würde Spott "machen die JVM laden eine große Anzahl von Klassen, die nicht einmal verwendet werden"? –

Antwort

15

gewarnt, dass

java -verbose 

mit Will eine enorme Menge an Output erzeugen. Protokollieren Sie die Ausgabe in eine Datei und verwenden Sie dann grep. Wenn Sie das T-Stück der "Filter haben können Sie dies versuchen:

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

Ich bin mir nicht sicher. Aber es gibt eine Möglichkeit, wie ich es sehen könnte. Es ist vielleicht übertrieben lächerlich. Sie können Aspekte ausprobieren und einen Pointcut für Loadclass setzen. Vielleicht auch das jvm-Argument -verbose vielleicht hilfreich.

35

Sie können einen eigenen Classloader erstellen und diesen zum Laden während des Komponententests verwenden. Lassen Sie Ihren eigenen Classloader drucken, was er tut.

Oder wenn Sie nur wissen wollen, welche Klassen geladen werden, tun:

java -verbose:class 
1

Als Alternative Art und Weise, für eine bestimmte Klasse-Lader wie Sie erwähnt haben, können Sie diesen Code-Schnipsel verwenden. Ändern Sie einfach den Wert der obj-Variablen, wenn Sie möchten.

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 
    } 
} 
Verwandte Themen