Instrumentation.getInitiatedClasses(ClassLoader)
peut faire ce que vous voulez.
Selon les docs:
Renvoie un tableau de toutes les classes pour lesquelles chargeur est un chargeur d'amorçage.
Je ne suis pas sûr de ce que signifie "initiateur loader". Si cela ne donne pas le bon résultat, essayez d'utiliser la méthode getAllLoadedClasses()
et de filtrer manuellement par ClassLoader.
Comment obtenir une instance de Instrumentation
Seul le JAR agent (qui est séparé de l'application JAR) peut obtenir une instance de l'interface Instrumentation
. Un moyen simple de le rendre disponible à l'application est de créer un JAR d'agent contenant une classe avec une méthode premain
qui ne fait rien d'autre qu'une sauvegarde de l'instance Instrumentation
dans les propriétés du système.
Exemple classe d'agent:
public class InstrumentHook {
public static void premain(String agentArgs, Instrumentation inst) {
if (agentArgs != null) {
System.getProperties().put(AGENT_ARGS_KEY, agentArgs);
}
System.getProperties().put(INSTRUMENTATION_KEY, inst);
}
public static Instrumentation getInstrumentation() {
return (Instrumentation) System.getProperties().get(INSTRUMENTATION_KEY);
}
// Needn't be a UUID - can be a String or any other object that
// implements equals().
private static final Object AGENT_ARGS_KEY =
UUID.fromString("887b43f3-c742-4b87-978d-70d2db74e40e");
private static final Object INSTRUMENTATION_KEY =
UUID.fromString("214ac54a-60a5-417e-b3b8-772e80a16667");
}
Exemple manifeste:
Manifest-Version: 1.0
Premain-Class: InstrumentHook
Le JAR résultant doit alors être référencé par l'application et spécifiée sur la ligne de commande (avec l'option -javaagent
) lorsque lancer l'application. Il peut être chargé deux fois dans ClassLoader
s différents, mais ce n'est pas un problème puisque le système Properties
est un singleton par processus.
Exemple d'application classe
public class Main {
public static void main(String[] args) {
Instrumentation inst = InstrumentHook.getInstrumentation();
for (Class<?> clazz: inst.getAllLoadedClasses()) {
System.err.println(clazz.getName());
}
}
}
Voir aussi: http://forums.sun.com/thread.jspa?threadID=341935&start=15 – finnw