ClassLoader 詳解
1. classLoader是什麽?
ClassLoader是類的加載器,用於加載class對象到JVM中的,分為2種,啟動類加載器和實際類加載器.
2. ClassLoader的作用
.java文件通過javac.exe編譯成.class文件,然後通過classLoader加載到JVM內存中. 加載到JVM內存的就是Class對象,存儲著.class字節碼內容,每一個class對象都有getClassLoader()方法, 得到是誰把我從.class文件加載到內存中變成Class對象的。
3. ClassLoader層次結構
1).根類加載器(null) ..由本地代碼(c/c++)
2).擴展內加載器(ExtClassLoader) .. 主要加載擴展目錄下的jar包, %JAVA_HOME%\lib\ext
3). 應用類加載器(AppClassLoader) ...主要加載我們應用程序中的類
4. Class加載時調用類加載器的順序
應用類加載器 ----委托加載---》 擴展類加載器--委托加載---》 根類加載器
當一個類要被加載時,有一個啟動類加載器和實際類加載器的概念,這個概念請看如下分析
如上面的Test.class要進行加載時,它將會啟動應用類加載器進行加載Test
所以這個時候根類加載器就去加載這個類,可在%JAVA_HOME%\jre\lib下,它找不到com.Test這個類,所以他告訴他的子類加載器,我找不到,你去加載吧,子類擴展類加載器去%JAVA_HOME%\lib\ext去找,也找不著,它告訴它的子類加載器 AppClassLoader,我找不到這個類,你去加載吧,結果AppClassLoader找到了,就加到內存中,並生成Class對象。
這個時間時候啟動類加載器(應用類加載器)和實際類加載器(應用類加載器)是同一個。
ClassLoader利用其特性可以防止java核心類被覆蓋。編寫java.lang.Long類,定義一個main方法,執行該main方法時,會出現找不到main方法的提示。
沒有main方法是因為執行的根本不是我們自己寫的類,執行的是java核心中的那個Long類,當然沒有main方法了。 這樣就防止我們應用中寫的類覆蓋掉java核心類。
參考:
1.Java類加載器(http://www.cnblogs.com/wang-meng/p/5574071.html )
2.ClassLoader 詳解及用途[http://blog.chinaunix.net/uid-21227800-id-65885.html]
ClassLoader 詳解