-
Notifications
You must be signed in to change notification settings - Fork 841
Expand file tree
/
Copy pathJvmClassLoaderPrintPath.java
More file actions
62 lines (51 loc) · 1.87 KB
/
JvmClassLoaderPrintPath.java
File metadata and controls
62 lines (51 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.List;
public class JvmClassLoaderPrintPath {
public static void main(String[] args) {
// 启动类加载器
URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
System.out.println("启动类加载器");
for (URL url : urls) {
System.out.println(" ===> " + url.toExternalForm());
}
// 扩展类加载器
printClassloader("扩展类加载器",JvmClassLoaderPrintPath.class.getClassLoader().getParent());
// 应用类加载器
printClassloader("应用类加载器",JvmClassLoaderPrintPath.class.getClassLoader());
}
private static void printClassloader(String name, ClassLoader classLoader) {
System.out.println();
if (null != classLoader) {
System.out.println(name + " Classloader -> " + classLoader.toString());
printURLForClassloader(classLoader);
} else {
System.out.println(name + " Classloader -> null");
}
}
private static void printURLForClassloader(ClassLoader classLoader) {
Object ucp = insightField(classLoader,"ucp");
Object path = insightField(ucp,"path");
List paths = (List) path;
for (Object p : paths) {
System.out.println(" ===> " + p.toString());
}
}
private static Object insightField(Object obj, String fName) {
Field f = null;
try {
if (obj instanceof URLClassLoader) {
f = URLClassLoader.class.getDeclaredField(fName);
} else {
f = obj.getClass().getDeclaredField(fName);
}
f.setAccessible(true);
return f.get(obj);
}
catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}