说明:笔记内容来源于《北京圣思园教育 - 张龙老师 - 深入理解JVM》视频课程。如有侵权,请联系删除。
1 父子类加载器的演示
package com.test;
public class MyTest10 {
public static void main(String[] args) {
//获取系统类加载器
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
while (null != classLoader) {
classLoader = classLoader.getParent();
System.out.println(classLoader);
}
}
}
执行结果如下:
系统类加载器 的父加载器为 扩展类加载器
扩展类加载器 的父加载器为 根类加载器
2 通过字节码路径加载类
package com.test;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
public class MyTest10 {
public static void main(String[] args) throws IOException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader);
//通过斜杠分隔的包名
String resourceName = "com/test/MyTest9.class";
Enumeration<URL> urls = classLoader.getResources(resourceName);
while(urls.hasMoreElements()) {
URL oneUrl = urls.nextElement();
System.out.println(oneUrl);
}
}
}
执行结果如下:
3 获得ClassLoader的途径
a. 获得当前类的ClassLoader
clazz.getClassLoader();
package com.test;
import java.io.IOException;
public class MyTest10 {
public static void main(String[] args) throws IOException {
Class<?> clazz = MyTest10.class;
System.out.println(clazz.getClassLoader());
}
}
执行结果如下:
package com.test;
import java.io.IOException;
public class MyTest10 {
public static void main(String[] args) throws IOException {
Class<?> clazz = String.class;
System.out.println(clazz.getClassLoader());
}
}
执行结果如下:
b. 获得当前线程上下文的ClassLoader
Thread.currentThread.getContextClassLoader();
package com.test;
public class MyTest10 {
public static void main(String[] args) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
System.out.println(classLoader);
}
}
执行结果如下:
c. 获得系统的ClassLoader
ClassLoader.getSystemClassLoader();
package com.test;
public class MyTest10 {
public static void main(String[] args) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
}
}
执行结果如下:
d. 获得调用者的ClassLoader
DriverManager.getCallerClassLoader();