反射中的 Class.forName() 與 ClassLoader.loadClass() 的區別
阿新 • • 發佈:2019-02-26
註意 als name ole 校驗 嚴格 載器 初始化 left
在Java中,類加載器把一個類加載進Java虛擬機中,要經過三個步驟來完成:加載、鏈接和初始化,其中鏈接又可以分成驗證、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
- 加載:查找和導入類或接口的二進制數據;
- 鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
- 驗證:檢查導入類或接口的二進制數據的正確性;
- 準備:給類的靜態變量分配並初始化存儲空間;
- 解析:將符號引用轉成直接引用;
- 初始化:激活類的靜態變量的初始化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() 的區別