Instrumentation.getInitiatedClasses(ClassLoader)
può fare quello che vuoi.
Secondo la documentazione:
restituisce un array di tutte le classi per cui caricatore è un caricatore iniziatore.
Non sono sicuro di cosa significhi "avviare caricatore". Se questo non dà il risultato giusto prova a usare il metodo getAllLoadedClasses()
e filtra manualmente con ClassLoader.
Come ottenere un'istanza di Instrumentation
Solo il JAR agente (che è separato dalla JAR dell'applicazione) può ottenere un'istanza dell'interfaccia Instrumentation
. Un modo semplice per renderlo disponibile all'applicazione è creare un agent JAR contenente una classe con un metodo premain
che non faccia altro che salvare un riferimento all'istanza Instrumentation
nelle proprietà di sistema.
Esempio classe agente:
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");
}
Esempio manifesto:
Manifest-Version: 1.0
Premain-Class: InstrumentHook
Il JAR risultante deve essere poi applicata dall'applicazione e specificato sulla linea di comando (con l'opzione -javaagent
) quando avvio dell'applicazione. Potrebbe essere caricato due volte in diversi ClassLoader
s, ma questo non è un problema poiché il sistema Properties
è un singleton per processo.
classe di applicazione Esempio
public class Main {
public static void main(String[] args) {
Instrumentation inst = InstrumentHook.getInstrumentation();
for (Class<?> clazz: inst.getAllLoadedClasses()) {
System.err.println(clazz.getName());
}
}
}
Vedi anche: http://forums.sun.com/thread.jspa?threadID=341935&start=15 – finnw