1、類加載的雙親委託機制詳解

 

    在父親委託機制中,各個加載器按照父子關係造成了樹形結構,除了根類加載器以外,其他類加載器都有且只有一個父加載器java

 

    通俗理解: 某一個類加載器加載一個特定的類,他並非當即由本身加載了,而是將這個動做委託給父親來完成,若是父親還有父親,就繼續將這個動做向上傳遞,一直到沒有父親的   根類加載器測試

也就是啓動類加載器。由根類加載來嘗試着進行加載咱們所要加載的class文件,若是不成功,就返回給拓展類加載器,拓展類加載器嘗試着加載,若是不成功就繼續向下傳遞,一直到加載成功,而後將整個加載動做返回給第一次嘗試加載的加載器中。spa

 

      本身想要去加載,本身不去加載,讓本身的父親去加載,若是上面還有,就繼續向上追溯,一直到根節點,而後根節點嘗試本身加載,若是能加載,則成功,傳遞加載動做給 第一次加載的類加載器,若是不成功,傳遞給子節點,讓子節點嘗試去加載,子節點可否加載成功,成功則返回加載動做,若是不成功,接續傳遞給子節點,重複執行。3d

 

    並非全部的類加載都是雙親委託機制  Oracle 的JDK 是標準的雙親委託機制code

 

 

2、使用代碼進行測試、分別加載String  和用戶自定義的類

    

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

              

相關文章
相關標籤/搜索