2009-10-05 7 views
4

Quel est le moyen le plus simple d'obtenir une liste de toutes les classes utilisées lors de l'exécution d'une application Java?Obtention d'une liste de toutes les classes utilisées lors de l'exécution d'une application Java?

On suppose que com.package.Foo.main est invoquée en exécutant:

java com.package.Foo 

Après avoir exécuté le programme que je voudrais avoir une liste de toutes les classes qui ont été utilisées lors de l'exécution du programme:

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

Dans ce contexte, une classe est définie comme étant utilisée si la classe a été chargée par le chargeur de classe pendant l'exécution du programme et que le bloc statique de la classe aurait été exécuté si ce bloc statique avait existé.

+1

Dup de http: // stackoverflow.com/questions/1432180/est-il-un-moyen-d'-obtenir-quelles-classes-un-classloader-a-chargé, bien qu'il n'y ait pas grand-chose à regarder – skaffman

+1

skaffman: Je ne crois pas que ce soit exact dupliquer. Ma question est plus générale et bien définie. – knorv

Répondre

12

Run java avec le drapeau bavard: classe

java -verbose:class com.package.Foo 

Pour ajouter à un fichier:

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

etc.

Il liste également le pot où ces fichiers sont défini:

Par exemple pour cette cl Ass

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

J'ai (entre autres)

 
$ 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] 
+0

Merci pour une réponse rapide et précise! Exactement ce que je cherchais. – knorv

1

Vous pouvez faire quelque chose le long de ces lignes:

1) Activer le chargement de classe bavard en passant -verbose:class sur votre ligne de commande java

Cela affichera une ligne comme

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

pour chaque classe chargée.

2) post-traitement de la sortie avec les utilitaires de texte * nix (grep, sed, etc.) pour trouver toutes les instances de ces messages et d'extraire et de trier les noms de classe

1

Je crois que vous pouvez également utiliser Jakarta Commons Discovery , avec un code similaire à ce qui suit:

ResourceNameIterator classes = new DiscoverClasses().findResourceClasses(Object.class); 
while (classes.hasNext()) { 
    String className = classes.nextResourceClass().getName(); 
    Class clazz = classes.nextResourceClass().loadClass(); 
} 
0

Si vous êtes intéressé par quelles méthodes sont utilisées, voici ma méthode outil de traçage:

https://bitbucket.org/espinosa/methodcallspy

Vous pouvez également activer et désactiver le suivi, de cette façon vous pouvez obtenir la trace de seulement la fonctionnalité sélectionnée. Vous pouvez filtrer des paquets spécifiques etc. La méthode java -verbose:class n'est pas très utile avec les applications Spring, où presque tout est initialement chargé et initialisé, mais pas nécessaire.

Questions connexes