How can I list all classes loaded in a specific class loader
Instrumentation.getInitiatedClasses(ClassLoader)
may do what you want.
According to the docs:
Returns an array of all classes for which loader is an initiating loader.
I'm not sure what "initiating loader" means though. If that does not give the right result try using the getAllLoadedClasses()
method and manually filtering by ClassLoader.
How to get an instance of Instrumentation
Only the agent JAR (which is separate from the application JAR) can get an instance of the Instrumentation
interface. A simple way to make it available to the application is to create an agent JAR containing one class with a premain
method that does nothing but save a reference to the Instrumentation
instance in the system properties.
Example agent class:
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");
}
Example manifest:
Manifest-Version: 1.0
Premain-Class: InstrumentHook
The resulting JAR must then be referenced by the application and specified on the command line (with the -javaagent
option) when launching the application. It might be loaded twice in different ClassLoader
s, but that is not a problem since the system Properties
is a per-process singleton.
Example application class
public class Main {
public static void main(String[] args) {
Instrumentation inst = InstrumentHook.getInstrumentation();
for (Class<?> clazz: inst.getAllLoadedClasses()) {
System.err.println(clazz.getName());
}
}
}
Obtaining a list of all Java classes used from all JVM's?
You could use the jcmd command that comes with the JDK. It does not require any special arguments to be past to the JVM upon start.
jcmd
Will list all of the JVMs that are currently running, along with their pid (process id).
jcmd <pid> GC.class_histogram
will then list every class that is currently loaded in that JVM, along with a count of how many instances.
How to get a list of all classes that are loaded by the bootstrap class loader?
Watch the method getInitiatedClasses:
http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html
Related Topics
Field Required a Bean of Type That Could Not Be Found.' Error Spring Restful API Using Mongodb
Java Calendar, Date, and Time Management for a Multi-Timezone Application
Execute Method on Startup in Spring
How to Create and Run Apache Jmeter Test Scripts from a Java Program
Program Freezes During Thread.Sleep() and with Timer
How to Set Specific Java Version to Maven
No Suitable Driver Found for 'Jdbc:Mysql://Localhost:3306/Mysql
Possible Causes of Java Vm Exception_Access_Violation
How to Handle Very Large Numbers in Java Without Using Java.Math.Biginteger
Java Date() Giving the Wrong Date
How to Add Hyperlink in Jlabel
Why Does Java Have an "Unreachable Statement" Compiler Error
Break or Return from Java 8 Stream Foreach
Collection to Stream to a New Collection
Java Gui Frameworks. What to Choose? Swing, Swt, Awt, Swingx, Jgoodies, Javafx, Apache Pivot