Есть ли способ узнать, какие классы загрузил ClassLoader?

StackOverflow https://stackoverflow.com/questions/1432180

Вопрос

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

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

Это было полезно?

Решение

Имейте в виду, что с помощью

java -verbose

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

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

Другие советы

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

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

java -verbose:class

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

В качестве альтернативы для конкретного загрузчика классов, как вы упомянули, вы можете использовать этот фрагмент кода. Просто измените значение переменной 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
    }
}

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

Краткое содержание

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

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

Например

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

Окарл док

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top