1. 程式人生 > >深入類載入器----類載入器的分類和等級

深入類載入器----類載入器的分類和等級

              深入類載入器(三)----類載入器的分類和等級

 

       深入類載入器層次結構(三種類載入器)代理載入模式,雙親委託機制

   我們首先要知道在java中,類載入器也是分等級的。最高階的一種載入器是載入java中的核心包下的類。比如說java.ang.String類就是通過這種類載入器進行載入的。下一個等級的就是額外的類載入器。也是載入一些類的。再下一級的就是應用程式的類載入器。再下一級的就是自定義的類載入器了。但是這幾種載入器之間不是繼承關係的,而是組合關係的。這是要注意的。

  java中,類載入採用的是代理模式。所謂的代理模式,可以簡單的理解為,看起來是這個類載入器進行載入,但其實並不是這個載入器進行載入。這就是代理模式。

  在代理模式中,有一個比較重要的一種是雙親委託模式。所謂的雙親委託模式就是:比如說,我定義了一個類A,在載入類A的時候,首先由自定義的類載入器,再到應用程式的類載入器,再到拓展的類載入器,最後到最高階的載入器。首先是由最高階的載入器進行判斷,它是否能夠載入這個類,如果能夠載入的話,就進行載入。如果不能夠進行載入的話,再接下來看一下額外的類載入器能否進行載入。這樣一層一層地往下。如果都不能載入的話,那麼就會出現錯誤。這是要注意的。

  雙親委託機制的最大的好處就是可以確保是安全的。

  比如說,我舉一個例子:

  我首先定義可java.lang包。然後我在這個package的下面定義了一個String

類。由於String類是java中的核心包,理應是由最高等級的那個類載入器進行載入的。我們採用了雙親委託的模式: 由上往下,一層一層進行判斷,是否能夠載入。首先是在最高等級的那個類載入器當中,發現String類是核心包下的一個類。那麼就不會對我們自定義的一個類進行載入了。所以即使我們定義了那個類,我們也不能使用這個類。這就是雙親委託模式的好處,可以確保了安全。但是也並不是所有的類載入的過程都是採用雙親委託模式的。比如Tomcat伺服器採用的就不是雙親委託模式,它的載入的過程和雙親委託模式是正好相反的。但是也是代理的模式。

 package com.lg.test;

public class Demo02 {

public static void main(String[] args){

System.out.println(ClassLoader.getSystemClassLoader());

System.out.println(ClassLoader.getSystemClassLoader().getParent());

//為什麼最後一個類載入器顯示的是null呢。其實也是很容易理解的。

//由於這個最高等級的類載入器是使用原始程式碼進行載入的。也就是實用c++或者c進行編寫的。

//所以在java中載入不出來。

System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());

//這裡顯示的是類載入的路徑。由於bin目錄下放置的都是一些類的編譯成的class檔案。所以

//會從這裡進行載入。這是要注意的。

System.out.println(System.getProperty("java.class.path"));

String info="liguo";

//通過這個我們發現,我們定義的java.lang.String下的包並沒有被使用

//並且我們發現類載入器是null。那麼通過代理模式下的雙親委託模式,我們就可以保證類載入的

//安全性。這是要注意的。

System.out.println(info.toString());

System.out.println(info.getClass().getClassLoader());

}

}

最後的輸出的結果為:

[email protected]

[email protected]

null

C:\Users\liguo\workspace\Others\bin

liguo

null

相關推薦

深入載入----載入分類等級

              深入類載入器(三)----類載入器的分類和等級          深入類載入器層次結構(三種類載入器)代理載入模式,雙親委託機制    我們首先要知道在java

深入理解java虛擬機器(三)(一個載入只初始化一次物件,不同類載入可以對同一類物件進行初始化)

package com.ygl; class Final{public static final int x=6/3;//此處x在編譯時能計算出值,是編譯時的常量,則System.out.println(Final.x);直接輸出值,不再執行下面static(前提是fina

深入JVM系列(三)之類載入載入、雙親委派機制與常見問題

一.概述 定義:虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的java型別。類載入和連線的過程都是在執行期間完成的。 二.

Java程式設計師從笨鳥到菜鳥之(九十八)深入java虛擬機器(七)深入原始碼看java載入ClassLoader

      歡迎閱讀本專題的其他部落格:          ClassLoader類載入器是負責載入類的物件。ClassLoader 類是一個抽象類。如果給定類的二進位制名稱(即為包名加類名的全稱),那麼類載入器會試圖查詢或生成構成類定義的資料。一般策略是

Java原始碼分析——Class、ClassLoader解析(三) 載入、實現自定義載入

    在這個系列的第一篇章就講解了Class類的獲取以及載入過程,但是並沒有提及具體的載入過程,在java中,載入一個類是通過ClassLoader類來執行的,也就是類載入器完成。java中所有的類,都必須載入進jvm中才能執行,這個載入的意思是

兩個載入載入同一個的實驗

測試程式碼: Class cl = Class.forName("com.tang.test1.A");//使用AppClassLoader載入類 System.out.println(cl.getClassLoader()); Runtime.getRuntime().e

不同的載入載入不是同一個

一,有兩個術語,一個叫“定義類載入器”,一個叫“初始類載入器”。比如有如下的類載入器結構:bootstrap  ExtClassloader    AppClassloader    -自定義clsloadr1    -自定義clsloadr2 如果用“自定義clsloadr

c# 異常檔案中的都不能進行設計,因此未能為該檔案顯示設計。設計檢查出檔案中有以下: FormMain --- 未能載入

出現該問題的原因:FormMain從FormMainBase繼承之後,一旦修改FormMainBase就會出現這個問題解決方案:(1-4是搜尋網友的)   1: 關閉VS所有視窗,後重啟.即可返回正常. 2: 第一種方案不成功,關閉VS所有視窗,點選解決方案->清理解決

載入 - 載入、連線與初始化

類的載入、連線與初始化 概述 在Java程式碼中,型別的載入、連線與初始化過程都是在程式執行期間完成的 型別:可以理解為一個class 載入:查詢並載入類的二進位制資料,最常見的情況是將已經編譯完成的類的class檔案從磁碟載入到記憶體中 連線:確定型別與型別之間的關係,對於位元組碼的相關處理 驗證:確保

深入拆解虛擬機器(三)Java虛擬機器是如何載入Java的?

引用型別 (1)類、介面、陣列類、泛型引數,由於泛型引數在編譯過程中被擦除,因此Java虛擬機器實際上只有前三種。 (2)在類、介面和陣列類中,陣列類是由Java虛擬機器直接生成的,其他兩種則有對應的位元組流。 載入 (1)載入,是指查詢位元組流。Java虛擬機器需

深入理解Java虛擬機器(檔案結構+載入機制+位元組碼執行引擎)

周志明的《深入理解Java虛擬機器》很好很強大,閱讀起來頗有點費勁,尤其是當你跟隨作者的思路一直探究下去,開始會讓你弄不清方向,難免有些你說的啥子的感覺。但知識不得不學,於是天天看,反覆看,就慢慢的理解了。我其實不想說這種硬磨的方法有多好,我甚至不推薦,我建議大家閱讀這本書時,由淺入深,有舍有得,先從巨集觀去

深入理解Java:載入機制及反射

 說明:本文乃學習整理參考而來. 一、Java類載入機制 1.概述        Class檔案由類裝載器裝載後,在JVM中將形成一份描述Class結構的元資訊物件,通過該元資訊物件可以獲知Class的結構資訊:如建構函式,屬性和方法等,Java允許使用者藉由這個Class相關的元資訊物件間接呼

深入理解JVM(八)——載入的時機

類的生命週期 一個類從載入進記憶體到卸載出記憶體為止,一共經歷7個階段: 載入——>驗證——>準備——>解析——>初始化——>使用——>解除安裝 其中,類載入包括5個階段: 載入——>驗證——>準備——

Hibernate 半深入載入與懶載入代理

標籤(空格分隔): 後端技術學習 前言 在hibernate的使用中,為了減少對資料庫的訪問,對於存在關聯關係對映表使用的時候,我們可以使用懶載入的方式,讓hibernate幫我查詢單個物件資訊的同時,暫緩查詢它所關聯的另一些物件的資訊,當我們真正的使用

讀鄭雨迪《深入拆解Java虛擬機器》 -- 第三講 Java虛擬機器是如何載入Java

我們把Java虛擬機器載入Java類比作蓋房子。那麼我們蓋房子,首先需要請建築師出個方案,然後去市政部門報備、驗證,通過後才可以開始蓋房子。蓋好房子還要裝修,之後才能住人。 從class檔案到記憶體中的類,按先後順序需要經過載入、連結以及初始化三大步驟。其中,連結過程中

深入探討Java的載入機制

 Java 語言是一種具有動態性的解釋型程式語言,當指定程式執行的時候, Java 虛擬機器就將編譯生成的 . class 檔案按照需求和一定的規則載入進記憶體,並組織成為一個完整的 Java 應用程式。 Java 語言把每個單獨的類 Class 和介面 Implements

深入理解jvm的載入機制

一、類的生命週期 java程式使用某個類時,必須按照以下順序執行: (1)載入:查詢並載入類的二進位制資料; (2)連線:包括驗證、準備和解析類的二進位制; 驗證:確保載入類的正確性;準備:為類的靜態變數分配記憶體,並將其初始化為預設值;解析:把類中的符號引用轉為直接引用(3)初始化:給類的靜態變數賦

深入理解Java虛擬機器》- Java虛擬機器是如何載入Java的?

  Java虛擬機器是如何載入Java類的?  這個問題也就是面試常問到的Java類載入機制。在年初面試百戰之後,菜鳥喜鵲也是能把這流程倒背如流啊!但是,也只是字面上的背誦,根本就是像上學時背書考試一樣。 tonight ! 我們把它對映到實戰裡,看看如何用程式碼說明這個流程。 ready

python-裝飾,與對象,私有字段,析構,__call__,繼承,多繼承,接口

裝飾器 類與對象 私有字段 析構 __call__ 繼承 1、裝飾器執行流程裝飾器:將原函數替換為wrapper函數def outer()@outer --- func1作為參數傳入outer()def wrapper() --- wrapper()放入內存return wrapp

文件中的都不能進行設計,因此未能為該文件顯示設計。設計檢查出文件中有以下: FormMain --- 未能加載基

color 理解 重新編譯 如果 窗口 images ges -i 引用 出現該問題的原因:FormMain從FormMainBase繼承之後,一旦修改FormMainBase就會出現這個問題 解決方案:(1-4是搜索網友的) 1: 關閉VS所有窗口,後重啟.即可返