|
Java在需要使用類別的時(shí)候,才會將類別加載,Java的類別載入是由類別載入器(Class loader)來達(dá)到的,預(yù)設(shè)上,在程序啟動之后,主要會有三個(gè)類別加載器:
1. Bootstrap Loader
2. ExtClassLoader
3. AppClassLoader
------ Bootstrap Loader是由C++撰寫而成,它負(fù)責(zé)搜尋JRE所在目錄的classes或lib目錄下的.jar檔案中(例如rt.jar)是否有指定的類別并加載(實(shí)際上是由系統(tǒng)參數(shù)sun.boot.class.path指定);
------ ExtClassLoader負(fù)責(zé)搜尋JRE所在目錄的lib/ext 目錄下的classes或.jar中是否有指定的類別并加載(實(shí)際上是由系統(tǒng)參數(shù)java.ext.dirs指定);
------ AppClassLoader則搜尋 Classpath中是否有指定的classes并加載(由系統(tǒng)參數(shù)java.class.path指定)。
Bootstrap Loader會在JVM啟動之后載入,之后它會載入ExtClassLoader并將ExtClassLoader的parent設(shè)為Bootstrap Loader,然后BootstrapLoader再加載AppClassLoader,并將AppClassLoader的parent設(shè)定為 ExtClassLoader。
在加載類時(shí),每個(gè)類加載器會先將加載類的任務(wù)交由其parent,如果parent找不到,才由自己負(fù)責(zé)加載,如果自己也找不到,就會丟出 NoClassDefFoundError。
每一個(gè)類別被載入后,都會有一個(gè)Class的實(shí)例來代表它,每個(gè)Class的實(shí)例都會記得是哪個(gè)ClassLoader加載它的,可以由Class的getClassLoader()取得加載該類別的ClassLoader。
|
|