1. 程式人生 > >反射中的 Class.forName() 與 ClassLoader.loadClass() 的區別

反射中的 Class.forName() 與 ClassLoader.loadClass() 的區別

註意 als name ole 校驗 嚴格 載器 初始化 left

在Java中,類加載器把一個類加載進Java虛擬機中,要經過三個步驟來完成:加載、鏈接和初始化,其中鏈接又可以分成驗證、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

  1. 加載:查找和導入類或接口的二進制數據;
  2. 鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
    • 驗證:檢查導入類或接口的二進制數據的正確性;
    • 準備:給類的靜態變量分配並初始化存儲空間;
    • 解析:將符號引用轉成直接引用;
  3. 初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊。

技術分享圖片

我們可以開始看2者的區別了。

Class.forName(className) 方法,其實調用的方法是Class.forName(className,true,classloader);註意第2個boolean參數,它表示的意思是在加載之後必須初始化。在執行過此方法後,目標對象的靜態塊代碼已經被執行,靜態參數也已經被初始化。

再看ClassLoader.loadClass(className) 方法,其實他調用的方法是ClassLoader.loadClass(className,false); 註意看第2個 boolean參數,該參數表示目標對象被加載後不進行鏈接,這就意味著不會去執行該類靜態塊中的內容。

反射中的 Class.forName() 與 ClassLoader.loadClass() 的區別