Есть ли способ узнать, какие классы загрузил ClassLoader?
-
07-07-2019 - |
Вопрос
Я пытаюсь реализовать модульное тестирование для старой структуры.Я пытаюсь изобразить уровень базы данных.К сожалению, наша структура немного устарела и не совсем использует лучшие практики, поэтому нет четкого разделения задач.Меня немного беспокоит, что попытка имитировать уровень базы данных может привести к тому, что 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