首頁>Club>
6
回覆列表
  • 1 # 使用者2273310495469

    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++)實現,載入(%JAVA_HOME%\jre\lib)


      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]

  • 中秋節和大豐收的關聯?
  • 工程總承包和施工總承包的區別是什麼?