真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

Java類加載器ClassLoader用法解析-創(chuàng)新互聯

這篇文章主要介紹了Java類加載器ClassLoader用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

專注于為中小企業(yè)提供成都網站建設、成都網站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)鯉城免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯網行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。

正文

當程序主動使用某個類時,如果該類還未被加載到內存中,則JVM會通過加載、連接、初始化3個步驟來對該類進行初始化。如果沒有意外,JVM將會連續(xù)完成3個步驟,所以有時也把這個3個步驟統(tǒng)稱為類加載或類初始化。

一、類加載過程

1.加載

加載指的是將類的class文件讀入到內存,并為之創(chuàng)建一個java.lang.Class對象,也就是說,當程序中使用任何類時,系統(tǒng)都會為之建立一個java.lang.Class對象。

類的加載由類加載器完成,類加載器通常由JVM提供,這些類加載器也是前面所有程序運行的基礎,JVM提供的這些類加載器通常被稱為系統(tǒng)類加載器。除此之外,開發(fā)者可以通過繼承ClassLoader基類來創(chuàng)建自己的類加載器。

通過使用不同的類加載器,可以從不同來源加載類的二進制數據,通常有如下幾種來源。

  • 從本地文件系統(tǒng)加載class文件,這是前面絕大部分示例程序的類加載方式。
  • 從JAR包加載class文件,這種方式也是很常見的,前面介紹JDBC編程時用到的數據庫驅動類就放在JAR文件中,JVM可以從JAR文件中直接加載該class文件。
  • 通過網絡加載class文件。
  • 把一個Java源文件動態(tài)編譯,并執(zhí)行加載。
  • 類加載器通常無須等到“首次使用”該類時才加載該類,Java虛擬機規(guī)范允許系統(tǒng)預先加載某些類。

2.鏈接

當類被加載之后,系統(tǒng)為之生成一個對應的Class對象,接著將會進入連接階段,連接階段負責把類的二進制數據合并到JRE中。類連接又可分為如下3個階段。

1)驗證:驗證階段用于檢驗被加載的類是否有正確的內部結構,并和其他類協(xié)調一致。Java是相對C++語言是安全的語言,例如它有C++不具有的數組越界的檢查。這本身就是對自身安全的一種保護。驗證階段是Java非常重要的一個階段,它會直接的保證應用是否會被惡意入侵的一道重要的防線,越是嚴謹的驗證機制越安全。驗證的目的在于確保Class文件的字節(jié)流中包含信息符合當前虛擬機要求,不會危害虛擬機自身安全。其主要包括四種驗證,文件格式驗證,元數據驗證,字節(jié)碼驗證,符號引用驗證。

四種驗證做進一步說明:

文件格式驗證:主要驗證字節(jié)流是否符合Class文件格式規(guī)范,并且能被當前的虛擬機加載處理。例如:主,次版本號是否在當前虛擬機處理的范圍之內。常量池中是否有不被支持的常量類型。指向常量的中的索引值是否存在不存在的常量或不符合類型的常量。

元數據驗證:對字節(jié)碼描述的信息進行語義的分析,分析是否符合java的語言語法的規(guī)范。

字節(jié)碼驗證:最重要的驗證環(huán)節(jié),分析數據流和控制,確定語義是合法的,符合邏輯的。主要的針對元數據驗證后對方法體的驗證。保證類方法在運行時不會有危害出現。

符號引用驗證:主要是針對符號引用轉換為直接引用的時候,是會延伸到第三解析階段,主要去確定訪問類型等涉及到引用的情況,主要是要保證引用一定會被訪問到,不會出現類等無法訪問的問題。

2)準備:類準備階段負責為類的靜態(tài)變量分配內存,并設置默認初始值。

3)解析:將類的二進制數據中的符號引用替換成直接引用。說明一下:符號引用:符號引用是以一組符號來描述所引用的目標,符號可以是任何的字面形式的字面量,只要不會出現沖突能夠定位到就行。布局和內存無關。直接引用:是指向目標的指針,偏移量或者能夠直接定位的句柄。該引用是和內存中的布局有關的,并且一定加載進來的。

3.初始化

初始化是為類的靜態(tài)變量賦予正確的初始值,準備階段和初始化階段看似有點矛盾,其實是不矛盾的,如果類中有語句:private static int a = 10,它的執(zhí)行過程是這樣的,首先字節(jié)碼文件被加載到內存后,先進行鏈接的驗證這一步驟,驗證通過后準備階段,給a分配內存,因為變量a是static的,所以此時a等于int類型的默認初始值0,即a=0,然后到解析(后面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時a=10。

二、類加載時機

  • 創(chuàng)建類的實例,也就是new一個對象
  • 訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值
  • 調用類的靜態(tài)方法
  • 反射(Class.forName("com.lyj.load"))
  • 初始化一個類的子類(會首先初始化子類的父類)
  • JVM啟動時標明的啟動類,即文件名和類名相同的那個類

除此之外,下面幾種情形需要特別指出:

對于一個final類型的靜態(tài)變量,如果該變量的值在編譯時就可以確定下來,那么這個變量相當于“宏變量”。Java編譯器會在編譯時直接把這個變量出現的地方替換成它的值,因此即使程序使用該靜態(tài)變量,也不會導致該類的初始化。反之,如果final類型的靜態(tài)Field的值不能在編譯時確定下來,則必須等到運行時才可以確定該變量的值,如果通過該類來訪問它的靜態(tài)變量,則會導致該類被初始化。

三、類加載器

類加載器負責加載所有的類,其為所有被載入內存中的類生成一個java.lang.Class實例對象。一旦一個類被加載如JVM中,同一個類就不會被再次載入了。正如一個對象有一個唯一的標識一樣,一個載入JVM的類也有一個唯一的標識。在Java中,一個類用其全限定類名(包括包名和類名)作為標識;但在JVM中,一個類用其全限定類名和其類加載器作為其唯一標識。例如,如果在pg的包中有一個名為Person的類,被類加載器ClassLoader的實例kl負責加載,則該Person類對應的Class對象在JVM中表示為(Person.pg.kl)。這意味著兩個類加載器加載的同名類:(Person.pg.kl)和(Person.pg.kl2)是不同的、它們所加載的類也是完全不同、互不兼容的。

JVM預定義有三種類加載器,當一個 JVM啟動的時候,Java開始使用如下三種類加載器:

1)根類加載器(bootstrap class loader):它用來加載 Java 的核心類,是用原生代碼來實現的,并不繼承自 java.lang.ClassLoader(負責加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類)。由于引導類加載器涉及到虛擬機本地實現細節(jié),開發(fā)者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。

下面程序可以獲得根類加載器所加載的核心類庫,并會看到本機安裝的Java環(huán)境變量指定的jdk中提供的核心jar包路徑:

public class ClassLoaderTest {
 
  public static void main(String[] args) {
    
    URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();
    for(URL url : urls){
      System.out.println(url.toExternalForm());
    }
  }
}

另外有需要云服務器可以了解下創(chuàng)新互聯建站www.cdcxhl.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


網頁題目:Java類加載器ClassLoader用法解析-創(chuàng)新互聯
當前URL:http://weahome.cn/article/sphpj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部