1、类加载器层级显示
以下代码可以展示加载器的层级
public class MyTest14 {
public static void main(String[] args) {
// 获得当前类的classloader
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
while (null != classLoader) {
classLoader = classLoader.getParent();
System.out.println(classLoader);
}
}
}
运行结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@1b6d3586
null
null代表的是根类加载器,即启动类加载器
2、线程上下文加载器
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
public class MyTest15 {
public static void main(String[] args) throws IOException {
// 获取线程上下文类加载器,即应用程序类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader);
String resourceName = "com/jvm/classloader/MyTest13.class";
// 通过给定名获取磁盘上所有这个路径的文件
Enumeration<URL> urls = classLoader.getResources(resourceName);
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
System.out.println(url);
}
System.out.println("======");
Class<MyTest15> aClass = MyTest15.class;
System.out.println(aClass.getClassLoader());
System.out.println("======");
Class<?> aClass1 = String.class;
System.out.println(aClass1.getClassLoader());
}
}
输出结果:
sun.misc.Launcher$AppClassLoader@18b4aac2
file:/G:/JVM-lecture/target/classes/com/jvm/classloader/MyTest13.class
======
sun.misc.Launcher$AppClassLoader@18b4aac2
======
null
3、获得ClassLoader的途径
// 获取当前类的ClassLoader
clazz.getClassLoader();
// 获取线程上下文类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
// 获得当前类的classloader
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
// 获得调用者的ClassLoader
DriverManager.getCallerClassLoader();