基本信息
class檔案徑打破了C或者C++等語言所遵循的傳統,使用這些傳統語言寫的程式通常首先被編譯,然後被連線成單獨的、專門支持特定硬體平台和作業系統的二進制檔案。通常情況下,一個平台上的二進制執行檔不能在其他平台上工作。而Java class檔案是可以運行在任何支持Java虛擬機的硬體平台和作業系統上的二進制檔案。
執行過程
2.1 執行過程簡介
當編譯和連線一個C++程式時,所獲得的可執行二進制檔案只能在指定的硬體平台和作業系統上運行,因為這個二進制檔案包含了對目標處理器的機器語言。而Java編譯器把Java源檔案的指令翻譯成位元組碼,這種位元組碼就是Java虛擬機的“機器語言”。
與普通程式不同的是,Java程式(class檔案)並不是本地的可執行程式。當運行Java程式時,首先運行JVM(Java虛擬機),然後再把Java class載入到JVM裡頭運行,負責載入Java class的這部分就叫做Class Loader。
2.2 JVM中的ClassLoader
JVM本身包含了一個ClassLoader稱為Bootstrap ClassLoader,和JVM一樣,BootstrapClassLoader是用本地代碼實現的,它負責載入核心JavaClass(即所有java.*開頭的類)。
另外JVM還會提供兩個ClassLoader,它們都是用Java語言編寫的,由BootstrapClassLoader載入;其中Extension ClassLoader負責載入擴展的Javaclass(例如所有javax.*開頭的類和存放在JRE的ext目錄下的類)ApplicationClassLoader負責載入應用程式自身的類。
當運行一個程式的時候,JVM啟動,運行bootstrapclassloader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後調用ExtClassLoader載入擴展API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個程式最基本的載入流程。
2.3 執行ClassLoader例子
什麼時候JVM會使用ClassLoader載入一個類呢?當你使用java去執行一個類,JVM使用ApplicationClassLoader載入這個類;然後如果類A引用了類B,不管是直接引用還是用Class.forName()引用,JVM就會找到載入類A的ClassLoader,並用這個ClassLoader來載入類B。JVM按照運行時的有效執行語句,來決定是否需要裝載新類,從而裝載儘可能少的類,這一點和編譯類是不相同的。