1. 程式人生 > >【Java】Java載入類機制

【Java】Java載入類機制

Java類載入器】

      JavaClassloader是Java執行時環境(Java Runtime Environment)的一部分,負責動態載入Java類到Java虛擬機器的記憶體空間中。

類通常是按需載入,即第一次使用該類時才載入。由於有了類載入器,Java執行時系統不需要知道檔案與檔案系統。

JVM有三種類載入器:

  1.啟動類載入器(Bootstrap):是在jvm啟動時建立的類載入器。它負責將(jre/lib)下面的核心類庫或-Xbootclasspath選項指定的jar包載入到記憶體中。

    2.

擴充套件類載入器(Extension):是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的。它負責將(jre/lib/ext)或者由系統變數-Djava.ext.dir指定位置中的類庫載入到記憶體中。

    3.系統類載入器(System):系統類載入器是由 Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑java-classpath或-Djava.class.path變數所指的目錄下的類庫載入到記憶體中。

      它們之間使用了雙親委派機制,如下圖。簡單說就是,當類載入器有載入需求的時候,先請示他的父類使用父類的搜尋路徑來加入,如果沒有找到的話,才使用自己的搜尋路徑來來搜尋類。


我們通過測試來看一下:

程式碼:

package com.bjpowernode.cl;

public class Test {

	/**
	 * Java類載入機制
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(ClassLoader.getSystemClassLoader());
		System.out.println(ClassLoader.getSystemClassLoader().getParent());
		System.out.println(ClassLoader.getSystemClassLoader().getParent()
				.getParent());
	}

}

結果是:


      測試結果表明:System類載入器的父載入器是Ext載入器,Ext類載入器的父載入器時得到了null,就是說Ext類載入器本身的父類載入器被設定為null,即用null來代表BootStrapLoader

好,下面再來大致順一下Java類載入機制的工作方式:

      當執行 java ***.class 的時候, java.exe 會幫助我們找到 JRE ,找到位於 JRE/bin/server中的 jvm.dll ,JVMJava虛擬機器,有了虛擬機器之後再載入動態庫,啟用 Java虛擬機器。虛擬機器器啟用以後,會先做一些初始化的動作,比如說讀取系統引數等。一旦初始化動作完成之後,就會產生第一個類載入器―― Bootstrap Loader(啟動類載入器), Bootstrap Loader 是由 C++ 所撰寫而成,這個 Bootstrap Loader所做的初始工作中,除了一些基本的初始化動作之外,最重要的就是載入 Launcher.java 之中的 ExtClassLoader(擴充套件類載入器),並設定其 Parent 為 null ,代表其父載入器為 BootstrapLoader 。然後 Bootstrap Loader再要求載入 Launcher.java 之中的System,並設定其 Parent 為之前產生的 ExtClassLoader實體。這兩個載入器都是以靜態類的形式存在的。

Tomcat類載入器】

tomcat有自己的類載入機制,是在Java類載入機制上的一種擴充套件。如下圖:


每個專案都有自己的類載入器。

除了Java本身的三種類載入機制外,其他的:

    1.Common:載入TOMCAT_HOME/common/*,對Tomcat和所有的web專案都起作用。

    2.Catalina:載入TOMCAT_HOME/server/*,對Tomcat起作用,對其他Web專案不起作用。

    3.Shared:載入TOMCAT_HOME/shared/*,它對所有的Web專案都起作用,對Tomcat不起作用。

    4.Web App相關載入器:載入每個web專案,只對當前web專案起作用。