diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/Launcher.java b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/Launcher.java new file mode 100644 index 0000000000..bd9573d6b5 --- /dev/null +++ b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/Launcher.java @@ -0,0 +1,19 @@ +package com.baeldung.loadedclasslisting; + +import java.util.Arrays; + +public class Launcher { + + public static void main(String[] args) { + printClassesLoadedBy("BOOTSTRAP"); + printClassesLoadedBy("SYSTEM"); + printClassesLoadedBy("EXTENSION"); + } + + private static void printClassesLoadedBy(String classLoaderType) { + System.out.println(classLoaderType + " ClassLoader : "); + Class[] classes = ListLoadedClassesAgent.listLoadedClasses(classLoaderType); + Arrays.asList(classes) + .forEach(clazz -> System.out.println(clazz.getCanonicalName())); + } +} diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClassesAgent.java b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClassesAgent.java new file mode 100644 index 0000000000..337214a664 --- /dev/null +++ b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/ListLoadedClassesAgent.java @@ -0,0 +1,40 @@ +package com.baeldung.loadedclasslisting; + +import java.lang.instrument.Instrumentation; + +public class ListLoadedClassesAgent { + + private static Instrumentation instrumentation; + + public static void premain(String agentArgs, Instrumentation instrumentation) { + ListLoadedClassesAgent.instrumentation = instrumentation; + } + + public static Class[] listLoadedClasses(String classLoaderType) { + if (instrumentation == null) { + throw new IllegalStateException( + "ListLoadedClassesAgent is not initialized."); + } + return instrumentation.getInitiatedClasses( + getClassLoader(classLoaderType)); + } + + private static ClassLoader getClassLoader(String classLoaderType) { + ClassLoader classLoader = null; + switch (classLoaderType) { + case "SYSTEM": + classLoader = ClassLoader.getSystemClassLoader(); + break; + case "EXTENSION": + classLoader = ClassLoader.getSystemClassLoader().getParent(); + break; + // passing a null value to the Instrumentation : getInitiatedClasses method + // defaults to the bootstrap class loader + case "BOOTSTRAP": + break; + default: + break; + } + return classLoader; + } +} diff --git a/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/MANIFEST.MF b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/MANIFEST.MF new file mode 100644 index 0000000000..4a60bda0b7 --- /dev/null +++ b/core-java-modules/core-java-jvm-2/src/main/java/com/baeldung/loadedclasslisting/MANIFEST.MF @@ -0,0 +1 @@ +Premain-Class: com.baeldung.loadedclasslisting.ListLoadedClassesAgent \ No newline at end of file