Comment puis-je liste toutes les classes chargées dans une classe spécifique chargeur
Pour des raisons de débogage, et de la curiosité, je voudrais la liste de toutes les classes chargées à un chargeur de classe.
De voir que la plupart des méthodes d'une classe loader sont protégés, quelle est la meilleure façon d'accomplir ce que je veux?
Merci!
Vous devez vous connecter pour publier un commentaire.
L'Instrumentation.getInitiatedClasses(ClassLoader)
pouvez faire ce que vous voulez.Selon les docs:
Je ne suis pas sûr de ce que "initier loader" signifie que. Si cela ne donne pas le bon résultat, essayez le
getAllLoadedClasses()
méthode manuellement et de filtrage par le chargeur de classe.Comment faire pour obtenir une instance de
Instrumentation
Seul l'agent JAR (qui est distinct de l'application JAR), vous pouvez obtenir une instance de la
Instrumentation
interface. Une façon simple de le rendre disponible à l'application est de créer un agent POT contenant une classe avec unpremain
méthode qui ne fait rien mais enregistrer une référence à laInstrumentation
exemple dans les propriétés du système.Exemple de classe de l'agent:
Exemple manifeste:
L'résultant POT doit alors être référencés par l'application et spécifié sur la ligne de commande (avec l'
-javaagent
option) lors du lancement de l'application. Il peut être chargé à deux reprises dans différentsClassLoader
s, mais ce n'est pas un problème puisque le systèmeProperties
est par processus singleton.Exemple d'application de classe
Class.forName
[c'est à dire en passant par le code natif], mais pas pour les appels directs pourClassLoader.loadClass
.ClassLoader.findLoadedClass
vérifie exactement ce que, si une classe dont le nom a été enregistré dans la réservation signé par le chargeur de classe.De l'essayer. C'est un hackerish solution, mais il le fera.
Le domaine
classes
dans tous les chargeurs de classes (sous le Soleil de l'impl depuis 1.0) détient dur de référence pour les classes définies par le chargeur de sorte qu'ils ne seront pas en GC avais. Vous pouvez prendre un avantage de la via de la réflexion.No field classes in class Ljava/lang/ClassLoader