类加载:虚拟机将描述类的数据从class 文件加载到内存中,对加载的数据进行验证,准备,解析,初始化;最后得到虚拟机认可后转化成直接可以使用的 java 类型的过程
当一个类加载器收到一个类加载请求时,首先把加载任务委托给父类加载器,依次递归;
如果父类加载器可以完成类加载任务,就成功返回;
只有当父类加载器无法完成加载任务时,才自己去加载
好处:
核心加载类的方法:
1 protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { 2 synchronized (getClassLoadingLock(name)) { 3 // First, check if the class has already been loaded 4 Class<?> c = findLoadedClass(name); 5 if (c == null) { 6 long t0 = System.nanoTime(); 7 try { 8 if (parent != null) { 9 //调用父类的 ClassLoader 来加载 10 c = parent.loadClass(name, false); 11 } else { 12 // 没找到父类加载器,查找最顶层的 BootstrapClassLoader 来加载 13 c = findBootstrapClassOrNull(name); 14 } 15 } catch (ClassNotFoundException e) { 16 // ClassNotFoundException thrown if class not found 17 // from the non-null parent class loader 18 } 19 if (c == null) { 20 // If still not found, then invoke findClass in order 21 // to find the class. 22 // 如果父类加载器都没找到,就直接调用查找类的方法去查找 23 long t1 = System.nanoTime(); 24 c = findClass(name); 25 // this is the defining class loader; record the stats 26 sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0); 27 sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1); 28 sun.misc.PerfCounter.getFindClasses().increment(); 29 } 30 } 31 if (resolve) { 32 resolveClass(c); 33 } 34 return c; 35 } 36 }
原文:https://www.cnblogs.com/sebastian-tyd/p/13579377.html