Получить список всех классов, используемых при запуске приложения Java? - PullRequest
4 голосов
/ 06 октября 2009

Какой самый простой способ получить список всех классов, используемых при запуске приложения Java?

Предположим, что com.package.Foo.main вызывается с помощью команды:

java com.package.Foo

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

cat classes-used.txt
com.package.Foo
com.package.FooHelper
com.otherpackage.SomeClass
java.lang.String
java.util.List
java.util.ArrayList

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

Ответы [ 4 ]

12 голосов
/ 06 октября 2009

Запуск Java с флагом подробный: класс

java -verbose:class com.package.Foo

Чтобы добавить его в файл:

java -verbose:class com.package.Foo > classes-used.txt

и т.д..

В нем также указан jar, в котором определены эти файлы:

Например, для этого класса

public class Test {
     public static void main( String [] args ) {
     }
}

У меня есть (среди прочих)

$ java -verbose:class Test 
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/classes.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/ui.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/laf.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jsse.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/jce.jar]
[Opened /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Classes/charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
1 голос
/ 06 октября 2009

Полагаю, вы также можете использовать Jakarta Commons Discovery с кодом, подобным следующему:

ResourceNameIterator classes = new DiscoverClasses().findResourceClasses(Object.class);
while (classes.hasNext()) {
    String className = classes.nextResourceClass().getName();
    Class clazz = classes.nextResourceClass().loadClass();
}
1 голос
/ 06 октября 2009

Вы можете сделать что-то в этом духе:

1) Разрешить загрузку подробного класса, передав -verbose:class в командной строке Java

Это выведет строку наподобие

[Loaded org.foo.Bar from file:XYZ.jar]

для каждого загруженного класса.

2) Постобработка вывода с помощью текстовых утилит * nix (grep, sed и т. Д.), Чтобы найти все экземпляры этих сообщений, извлечь и отсортировать имена классов

0 голосов
/ 12 июня 2013

Если вам интересно, какие методы используются, вот мой инструмент трассировки методов:

https://bitbucket.org/espinosa/methodcallspy

Вы также можете включать и выключать трассировку, таким образом, вы можете отслеживать только выбранные функции. Вы можете отфильтровать определенные пакеты и т. Д. Метод java -verbose:class не очень полезен в приложениях Spring, где почти все изначально загружается и инициализируется, но не обязательно используется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...