Skip to content

Commit 646496d

Browse files
committed
BAEL-4302 : How can I list all classes loaded in a specific class loader
1 parent 06563f4 commit 646496d

6 files changed

Lines changed: 148 additions & 0 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.baeldung.loadedclasslisting;
2+
3+
public enum ClassLoaderType {
4+
5+
SYSTEM, EXTENSION, BOOTSTRAP, CUSTOM
6+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.baeldung.loadedclasslisting;
2+
3+
import java.lang.reflect.Method;
4+
import java.util.Arrays;
5+
6+
import com.baeldung.loadedclasslisting.customLoader.ClassLoaderInfo;
7+
import com.baeldung.loadedclasslisting.customLoader.CustomClassLoader;
8+
9+
public class Launcher {
10+
11+
private static ClassLoader customClassLoader;
12+
13+
public static void main(String[] args) {
14+
15+
printClassesLoadedBy(ClassLoaderType.BOOTSTRAP);
16+
17+
printClassesLoadedBy(ClassLoaderType.SYSTEM);
18+
19+
printClassesLoadedBy(ClassLoaderType.EXTENSION);
20+
21+
printClassesLoadedBy(ClassLoaderType.CUSTOM);
22+
}
23+
24+
private static void printClassesLoadedBy(ClassLoaderType classLoaderType) {
25+
Class<?>[] classes;
26+
if (classLoaderType.equals(ClassLoaderType.CUSTOM)) {
27+
customClassLoader = customClassLoading();
28+
classes = ListLoadedClassesAgent.listLoadedClasses(customClassLoader);
29+
} else {
30+
classes = ListLoadedClassesAgent.listLoadedClasses(classLoaderType);
31+
}
32+
Arrays.asList(classes)
33+
.forEach(clazz -> System.out.println(
34+
classLoaderType + " ClassLoader : " + clazz.getCanonicalName()));
35+
}
36+
37+
private static CustomClassLoader customClassLoading() {
38+
CustomClassLoader customClassLoader = new CustomClassLoader();
39+
Class<?> c;
40+
try {
41+
c = customClassLoader.findClass(ClassLoaderInfo.class.getName());
42+
Object ob = c.getDeclaredConstructor()
43+
.newInstance();
44+
Method md = c.getMethod("printClassLoaders");
45+
md.invoke(ob);
46+
} catch (Exception e) {
47+
e.printStackTrace();
48+
}
49+
return customClassLoader;
50+
}
51+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.baeldung.loadedclasslisting;
2+
3+
import java.lang.instrument.Instrumentation;
4+
5+
public class ListLoadedClassesAgent {
6+
7+
private static Instrumentation instrumentation;
8+
9+
public static void premain(String agentArgs, Instrumentation instrumentation) {
10+
ListLoadedClassesAgent.instrumentation = instrumentation;
11+
}
12+
13+
public static Class<?>[] listLoadedClasses(ClassLoaderType classLoaderType) {
14+
if (instrumentation == null) {
15+
throw new IllegalStateException(
16+
"ListLoadedClassesAgent is not initialized.");
17+
}
18+
return instrumentation.getInitiatedClasses(
19+
getClassLoader(classLoaderType));
20+
}
21+
22+
public static Class<?>[] listLoadedClasses(ClassLoader classLoader) {
23+
if (instrumentation == null) {
24+
throw new IllegalStateException(
25+
"ListLoadedClassesAgent is not initialized.");
26+
}
27+
return instrumentation.getInitiatedClasses(classLoader);
28+
}
29+
30+
private static ClassLoader getClassLoader(ClassLoaderType classLoaderType) {
31+
ClassLoader classLoader = null;
32+
switch (classLoaderType) {
33+
case SYSTEM:
34+
classLoader = ClassLoader.getSystemClassLoader();
35+
break;
36+
case EXTENSION:
37+
classLoader = ClassLoader.getSystemClassLoader().getParent();
38+
break;
39+
case BOOTSTRAP:
40+
break;
41+
default:
42+
break;
43+
}
44+
return classLoader;
45+
}
46+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Premain-Class: com.baeldung.loadedclasslisting.ListLoadedClassesAgent
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.baeldung.loadedclasslisting.customLoader;
2+
3+
import java.util.ArrayList;
4+
5+
public class ClassLoaderInfo {
6+
7+
public void printClassLoaders() throws ClassNotFoundException {
8+
9+
System.out.println("Classloader of this class:" + ClassLoaderInfo.class.getClassLoader());
10+
System.out.println("Classloader of ArrayList:" + ArrayList.class.getClassLoader());
11+
}
12+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.baeldung.loadedclasslisting.customLoader;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
8+
public class CustomClassLoader extends ClassLoader {
9+
10+
@Override
11+
public Class<?> findClass(String name) throws ClassNotFoundException {
12+
byte[] b = loadClassFromFile(name);
13+
return defineClass(name, b, 0, b.length);
14+
}
15+
16+
private byte[] loadClassFromFile(String fileName) {
17+
InputStream inputStream = getClass().getClassLoader()
18+
.getResourceAsStream(fileName.replace('.', File.separatorChar) + ".class");
19+
byte[] buffer;
20+
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
21+
int nextValue = 0;
22+
try {
23+
while ((nextValue = inputStream.read()) != -1) {
24+
byteStream.write(nextValue);
25+
}
26+
} catch (IOException e) {
27+
e.printStackTrace();
28+
}
29+
buffer = byteStream.toByteArray();
30+
return buffer;
31+
}
32+
}

0 commit comments

Comments
 (0)