Java之雙親委託機制

雙親委派機制的工作流程:

1. 當前ClassLoader首先從自己已經加載的類中查詢是否此類已經加載,如果已經加載則直接返回原來已經加載的類。
每個類加載器都有自己的加載緩存,當一個類被加載了以後就會放入緩存,等下次加載的時候就可以直接返回了。

2.  當前classLoader的緩存中沒有找到被加載的類的時候,委託父類加載器去加載,依次遞歸(即:父類加載器採用同樣的策略,首先查看自己的緩存,然後委託父類的父類去加載,一直到bootstrp ClassLoader),如果父類加載器可以完成類加載任務,就成功返回;

3.  當所有的父類加載器都沒有加載的時候,再由當前的類加載器加載,並將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。

 

代碼示例

protected Class<?> loadClass(String className, boolean resolve) throws  ClassNotFoundException { 
    //首先從已經加載的類中查找
    Class<?> clazz = findLoadedClass(className);    
    if (clazz == null) {
        ClassNotFoundException suppressed = null;     
        try {   
             //如果沒有加載過,先調用父加載器的loadClass
             clazz = parent.loadClass(className, false);
        } catch (ClassNotFoundException e) {
             suppressed = e;
        }
      
        if (clazz == null) {        
           try {           
               //父加載器都沒有加載,則嘗試加載
               clazz = findClass(className);
           } catch (ClassNotFoundException e) {
                e.addSuppressed(suppressed);       
                throw e;
           }
        }
    }    

    return clazz;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章