http://bbs.tech.ccidnet.com/read.php?tid=663217
Java在需要使用類別的時候,才會將類別加載,Java的類別載入是由類別載入器(Class loader)來達到的,預設上,在程序啟動之后,主要會有三個類別加載器:Bootstrap Loader、ExtClassLoader與AppClassLoader。
Bootstrap Loader是由C++撰寫而成,預設上它負責搜尋JRE所在目錄的classes或lib目錄下的.jar檔案中(例如rt.jar)是否有指定的類別並加載(實際上是由系統參數sun.boot.class.path指定);預設上ExtClassLoader負責搜尋JRE所在目錄的lib/ext 目錄下的classes或.jar中是否有指定的類別並加載(實際上是由系統參數java.ext.dirs指定);AppClassLoader則搜尋 Classpath中是否有指定的classes並加載(由系統參數java.class.path指定)。
Bootstrap Loader會在JVM啟動之后載入,之后它會載入ExtClassLoader並將ExtClassLoader的parent設為Bootstrap Loader,然后BootstrapLoader再加載AppClassLoader,並將AppClassLoader的parent設定為 ExtClassLoader。
在加載類別時,每個類別加載器會先將加載類別的任務交由其parent,如果parent找不到,才由自己負責加載,如果自己也找不到,就會丟出 NoClassDefFoundError。
每一個類別被載入后,都會有一個Class的實例來代表它,每個Class的實例都會記得是哪個ClassLoader加載它的,可以由Class的getClassLoader()取得加載該類別的ClassLoader。
