17 Stimmen

Gibt es eine Möglichkeit zu erhalten, welche Klassen ein ClassLoader geladen hat?

Ich versuche, einige Unit-Tests für einen alten Rahmen zu implementieren. Ich versuche, die Datenbank-Schicht zu mock out. Leider ist unser Rahmen ein bisschen alt und nicht ganz mit Best Practices, so gibt es keine klare Trennung der Anliegen. Ich bin ein wenig besorgt, dass der Versuch, die Datenbankschicht zu mocken, dazu führen könnte, dass die JVM eine große Anzahl von Klassen lädt, die nicht einmal verwendet werden.

Ich verstehe Klassenlader nicht wirklich gut, so dass dies vielleicht kein Problem ist. Gibt es eine Möglichkeit, einen Blick auf alle Klassen zu werfen, die ein bestimmter ClassLoader geladen hat, um zu prüfen, was unter der Haube vor sich geht?

0 Stimmen

Wie würde Mocking "die JVM dazu bringen, eine große Anzahl von Klassen zu laden, die nicht einmal verwendet werden"?

50voto

Alex Miller Punkte 67243

Sie können Ihren eigenen Classloader erstellen und diesen zum Laden während des Unit-Tests verwenden. Lassen Sie Ihren eigenen benutzerdefinierten Classloader ausdrucken, was er gerade tut.

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

java -verbose:class

18voto

Kelly S. French Punkte 11857

Seien Sie gewarnt, dass die Verwendung von

java -verbose

Wird eine enorme Menge an Output produzieren. Protokollieren Sie die Ausgabe in einer Datei und verwenden Sie dann grep. Wenn Sie den Filter "tee" haben, können Sie dies versuchen:

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

3voto

Suraj Chandran Punkte 23973

Ich bin mir nicht sicher. Aber ich sehe eine Möglichkeit, wie es gemacht werden könnte. Vielleicht ist es aber zu lächerlich. Sie können Aspekte versuchen und einen Pointcut für loadclass setzen. Vielleicht auch das jvm Argument -verbose vielleicht hilfreich.

1voto

MMKarami Punkte 994

Als Alternative können Sie für einen bestimmten Class-Loader, wie Sie ihn erwähnt haben, diesen Codeschnipsel verwenden. Ändern Sie einfach den Wert der Variable obj, 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
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X