在父親委託機制中,各個加載器按照父子關係造成了樹形結構,除了根類加載器以外,其他類加載器都有且只有一個父加載器java
通俗理解: 某一個類加載器加載一個特定的類,他並非當即由本身加載了,而是將這個動做委託給父親來完成,若是父親還有父親,就繼續將這個動做向上傳遞,一直到沒有父親的 根類加載器測試
也就是啓動類加載器。由根類加載來嘗試着進行加載咱們所要加載的class文件,若是不成功,就返回給拓展類加載器,拓展類加載器嘗試着加載,若是不成功就繼續向下傳遞,一直到加載成功,而後將整個加載動做返回給第一次嘗試加載的加載器中。spa
本身想要去加載,本身不去加載,讓本身的父親去加載,若是上面還有,就繼續向上追溯,一直到根節點,而後根節點嘗試本身加載,若是能加載,則成功,傳遞加載動做給 第一次加載的類加載器,若是不成功,傳遞給子節點,讓子節點嘗試去加載,子節點可否加載成功,成功則返回加載動做,若是不成功,接續傳遞給子節點,重複執行。3d
並非全部的類加載都是雙親委託機制 Oracle 的JDK 是標準的雙親委託機制code
package com.zuoyan.classloader; public class ClassLoaderDemo { public static void main(String[] args) throws Exception { Class<?> clazz1 = Class.forName("java.lang.String"); ClassLoader clazz1ClassLoader = clazz1.getClassLoader(); Class<?> clazz2 = Class.forName("com.zuoyan.classloader.C"); ClassLoader classLoader2 = clazz2.getClassLoader(); System.out.println(clazz1ClassLoader); System.out.println(classLoader2); } } class C{ }
代碼執行結果:blog
null
sun.misc.Launcher$AppClassLoader@18b4aac2ssl
執行結果的解釋,若是是使用跟類加載進行加載的,返回的就是null ,如下是類加載中的getClassLoader 上的方法註釋get