
如圖所示,這是java JVM 類裝載過程,Java是如何加載到j(luò)vm里面然后被識(shí)別的呢,其實(shí)分為三步:
裝載:(loading)找到class對(duì)應(yīng)的字節(jié)碼文件。
連接:(linking)將對(duì)應(yīng)的字節(jié)碼文件讀入到JVM中。
初始化:(initializing)對(duì)class做相應(yīng)的初始化動(dòng)作。
Java中兩種加載class到JVM中的方式
Class.forName("className");其實(shí)這種方法調(diào)運(yùn)的是:
Class.forName(className, true,ClassLoader.getCallerClassLoader())方法??? ???
?參數(shù)一:className,需要加載的類的名稱。??? ????
參數(shù)二:true,是否對(duì)class進(jìn)行初始化(需要initialize)??? ????
參數(shù)三:classLoader,對(duì)應(yīng)的類加載器
?ClassLoader.laodClass("className"); 其實(shí)這種方法調(diào)運(yùn)的是ClassLoader.loadClass(name, false)方法:? ? ? ?
?參數(shù)一:name,需要加載的類的名稱??? ???
?參數(shù)二:false,這個(gè)類加載以后是否需要去連接(不需要linking)
兩種方式的區(qū)別:
Class.forName除了將類的.class文件加載到j(luò)vm中之外,還會(huì)對(duì)類進(jìn)行解釋,執(zhí)行類中的static塊。
而classloader只干一件事情,就是將.class文件加載到j(luò)vm中,不會(huì)執(zhí)行static中的內(nèi)容,只有在newInstance才會(huì)去執(zhí)行static塊。?forName("")得到的class是已經(jīng)初始化完成的
?loadClass("")得到的class是還沒有連接的??一般情況下,這兩個(gè)方法效果一樣,都能裝載Class。但如果程序依賴于Class是否被初始化,就必須用Class.forName(name)了。最重要的區(qū)別是 forName 會(huì)初始化Class,而 loadClass 不會(huì)。因此如果要求加載時(shí)類的靜態(tài)變量被初始化或靜態(tài)塊里的代碼被執(zhí)行就只能用 forName,而用 loadClass 只有等創(chuàng)建類實(shí)例時(shí)才會(huì)進(jìn)行這些初始化。