类加载器分三步来理解
1.基本原理 双亲委派机制
JVM类加载器是有亲子层级结构的,如下图 这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再 委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的 类加载路径中查找并载入目标类。 比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载 器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里找了半天 没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的 类加载路径里找了半天也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器, 应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。。 双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载
/**
* @Author: xzc
* @Date: 2021/8/11 3:07
* @Version 1.0
*/
public class TestJDKClassLoader {
/**
* 拿默认方法的类加载器 发现为空 因为这是c++的
* 拿自定义类加载器发现在父方法上
* 拿
*/
@Test
public void main01() {
String ss = new String("ss xxzc");
System.out.println(ss);
System.out.println(String.class.getClassLoader());
System.out.println(com.xzc.jvm.jvm01.Math.class.getClassLoader());
ClassLoader appClassLoader = Math.class.getClassLoader();
// ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
System.out.println("appClassLoader " +appClassLoader);
ClassLoader extClassLoader = appClassLoader.getParent();
System.out.println("extClassLoader " +extClassLoader);
ClassLoader bootStrapClassLoader = extClassLoader.getParent();
System.out.println("bootStrapClassLoader " +bootStrapClassLoader);
System.out.println("\n bootstrapLoader 加载以下文件:\n");
// URLClassPath bootstrapClassPath = Launcher.getBootstrapClassPath();
this.getURLs(Launcher.getBootstrapClassPath());
System.out.println("\n extClassLoader 加载以下文件:\n");
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println("\n appClassLoader 加载以下文件:\n");
String property = System.getProperty("java.class.path");
String[] strings = property.split(";");
getappClassLoaderURLs(strings);
// System.out.println(strings);
// System.out.println(System.getProperty("java.class.path"));
}
public void getappClassLoaderURLs(String[]