java類載入器載入類
❶ java類載入器有幾種
Java中載入器的種類大致可以分為四種:Bootstrap ClassLoader(由C++語言寫成),系統載入器(也就是內部類AppClassLoader),ExtClassLoader,以及java.net.UrlClassLoader.
當我們運行一個程序時,首先是找到JDK安裝目下的jvm.dll來啟動JAVA虛擬機,而後Bootstrap ClassLoader產生,接下來就是Bootstrap ClassLoader來載入ExtClassLoader,並且指定ExtClassLoader的父載入器為Bootstrap ClassLoader,但是因為Bootstrap ClassLoader用C++語言寫的,所以用JAVA的觀點來看,這個載入器的實例是不存在的,所以ExtClassLoader的父載入器被設置為了null,然後就是Bootstrap ClassLoader將AppClassLoader裝載,並指定其父載入器為ExtClassLoader。
JAVA是按照載入器的委派模型來實現的。這種模型是JAVA安全性機制的保證。並且值得我們注意的就是這幾個載入器的默認載入類的路徑。對於AppCLassLoder來說,它的路徑也就是我們的classpath裡面的路徑。而對於ExtClassLoader來說,它的路徑是jre\lib\ext\classes.對於URLClassLoader來說,它的載入路徑是我們指定的url。
❷ 請描述一下JVM載入class文件的原理機制
原理:Java中的所有類,都需要由類載入器裝載到JVM中才能運行。類載入器本身也是一個類,而它的工作就是把class文件從硬碟讀取到內存中。
在寫程序的時候,我們幾乎不需要關心類的載入,因為這些都是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的載入所需要的類。
類裝載方式,有兩種 :
1、隱式裝載, 程序在運行過程中當碰到通過new 等方式生成對象時,隱式調用類裝載器載入對應的類到jvm中。
2、顯式裝載, 通過class.forname()等方法,顯式載入需要的類
Java類的載入是動態的,它並不會一次性將所有類全部載入後再運行,而是保證程序運行的基礎類(像是基類)完全載入到jvm中,至於其他類,則在需要的時候才載入。這當然就是為了節省內存開銷。
(2)java類載入器載入類擴展閱讀:
Java的類載入器有三個,對應Java的三種類:
Bootstrap Loader :啟動類載入器,是虛擬機自身的一部分。負責將存放在lib目錄中的類庫載入到虛擬機中。其無法被Java程序直接引用。負責載入系統類 (指的是內置類,像是String,對應於C#中的System類和C/C++標准庫中的類)。
ExtClassLoader :負責載入擴展類(就是繼承類和實現類)。
AppClassLoader :負責載入用戶類路徑(ClassPath)上所指定的類庫(程序員自定義的類)。
JVM中類的載入是由類載入器(ClassLoader)和它的子類來實現行察的,Java中的類載入器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類。
由於Java的跨沒帶擾平台性,經過編譯的Java源程序並不是一個可執行程序,而是一個或多個類文件。當Java程序需要使用某個類時,JVM會確保這個類已經被載入、連接(驗證、准備和解析)和枯旦初始化。
類的載入是指把類的.class文件中的數據讀入到內存中,通常是創建一個位元組數組讀入.class文件,然後產生與所載入類對應的Class對象。載入完成後,Class對象還不完整,所以此時的類還不可用。
當類被載入後就進入連接階段,這一階段包括
驗證:為了確保Class文件的位元組流中包含的信息符合當前虛擬機的要求,並且不會危害虛擬機自身的安全。