Есть ли способ узнать, какие классы загружен ClassLoader? - PullRequest
13 голосов
/ 16 сентября 2009

Я пытаюсь реализовать какое-то модульное тестирование для старой платформы. Я пытаюсь смоделировать слой базы данных. К сожалению, наша структура немного устарела и не совсем использует лучшие практики, поэтому нет четкого разделения интересов. Я немного обеспокоен тем, что попытка смоделировать слой базы данных может заставить JVM загружать огромное количество классов, которые даже не будут использоваться.

Я не очень хорошо понимаю загрузчики классов, так что это может не быть проблемой. Есть ли способ достичь максимума во всех классах, которые загружает конкретный ClassLoader, чтобы доказать, что происходит под капотом?

Ответы [ 5 ]

39 голосов
/ 10 ноября 2009

Вы можете создать свой собственный Classloader и использовать его для загрузки во время модульного теста. Сделайте свой собственный Classloader распечатать, что он делает.

Или, если вы просто хотите узнать, какие классы загружены, выполните:

java -verbose:class
15 голосов
/ 10 ноября 2009

Имейте в виду, что при использовании

java -verbose

Будет производить огромное количество продукции. Записать вывод в файл и затем использовать grep. Если у вас есть фильтр 'tee', вы можете попробовать это:

java -verbose | tee classloader.log
grep class classloader.log
3 голосов
/ 22 сентября 2009

Я не уверен. Но я вижу, что это можно сделать одним способом. Это может быть слишком смешно, хотя. Вы можете попробовать аспекты и поставить pointcut для loadclass. Также возможно аргумент jvm -verbose может быть полезным.

1 голос
/ 05 сентября 2017

В качестве альтернативы, для конкретного загрузчика классов, как вы упомянули, вы можете использовать этот фрагмент кода. Просто измените значение переменной obj, если хотите.

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
    }
}
0 голосов
/ 30 марта 2019

Параметр -Xlog используется для настройки или включения ведения журнала с помощью унифицированной среды ведения журнала Java Virtual Machine (JVM). Преимущество в том, что вы можете записать результаты в текстовый файл

Синопсис

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]

В синтаксисе единой регистрации -verbose:class равно -Xlog:class+load=info

Например

java -Xlog:class+load=info:classloaded.txt

Ocarle doc

...