内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

java類加載機(jī)制和類加載器的使用方法-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)java類加載機(jī)制和類加載器的使用方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家專業(yè)提供景洪企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為景洪眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。

一、類加載過(guò)程

1.加載

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

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

通過(guò)使用不同的類加載器,可以從不同來(lái)源加載類的二進(jìn)制數(shù)據(jù),通常有如下幾種來(lái)源。

從本地文件系統(tǒng)加載class文件,這是前面絕大部分示例程序的類加載方式。

從JAR包加載class文件,這種方式也是很常見的,前面介紹JDBC編程時(shí)用到的數(shù)據(jù)庫(kù)驅(qū)動(dòng)類就放在JAR文件中,JVM可以從JAR文件中直接加載該class文件。

通過(guò)網(wǎng)絡(luò)加載class文件。

把一個(gè)Java源文件動(dòng)態(tài)編譯,并執(zhí)行加載。

類加載器通常無(wú)須等到“首次使用”該類時(shí)才加載該類,Java虛擬機(jī)規(guī)范允許系統(tǒng)預(yù)先加載某些類。

2.鏈接

當(dāng)類被加載之后,系統(tǒng)為之生成一個(gè)對(duì)應(yīng)的Class對(duì)象,接著將會(huì)進(jìn)入連接階段,連接階段負(fù)責(zé)把類的二進(jìn)制數(shù)據(jù)合并到JRE中。類連接又可分為如下3個(gè)階段。

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

四種驗(yàn)證做進(jìn)一步說(shuō)明:

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

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

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

符號(hào)引用驗(yàn)證:主要是針對(duì)符號(hào)引用轉(zhuǎn)換為直接引用的時(shí)候,是會(huì)延伸到第三解析階段,主要去確定訪問類型等涉及到引用的情況,主要是要保證引用一定會(huì)被訪問到,不會(huì)出現(xiàn)類等無(wú)法訪問的問題。

2)準(zhǔn)備:類準(zhǔn)備階段負(fù)責(zé)為類的靜態(tài)變量分配內(nèi)存,并設(shè)置默認(rèn)初始值。

3)解析:將類的二進(jìn)制數(shù)據(jù)中的符號(hào)引用替換成直接引用。說(shuō)明一下:符號(hào)引用:符號(hào)引用是以一組符號(hào)來(lái)描述所引用的目標(biāo),符號(hào)可以是任何的字面形式的字面量,只要不會(huì)出現(xiàn)沖突能夠定位到就行。布局和內(nèi)存無(wú)關(guān)。直接引用:是指向目標(biāo)的指針,偏移量或者能夠直接定位的句柄。該引用是和內(nèi)存中的布局有關(guān)的,并且一定加載進(jìn)來(lái)的。

3.初始化

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

二、類加載時(shí)機(jī)

創(chuàng)建類的實(shí)例,也就是new一個(gè)對(duì)象

訪問某個(gè)類或接口的靜態(tài)變量,或者對(duì)該靜態(tài)變量賦值

調(diào)用類的靜態(tài)方法

反射(Class.forName("com.lyj.load"))

初始化一個(gè)類的子類(會(huì)首先初始化子類的父類)

JVM啟動(dòng)時(shí)標(biāo)明的啟動(dòng)類,即文件名和類名相同的那個(gè)類

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

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

三、類加載器

類加載器負(fù)責(zé)加載所有的類,其為所有被載入內(nèi)存中的類生成一個(gè)java.lang.Class實(shí)例對(duì)象。一旦一個(gè)類被加載如JVM中,同一個(gè)類就不會(huì)被再次載入了。正如一個(gè)對(duì)象有一個(gè)唯一的標(biāo)識(shí)一樣,一個(gè)載入JVM的類也有一個(gè)唯一的標(biāo)識(shí)。在Java中,一個(gè)類用其全限定類名(包括包名和類名)作為標(biāo)識(shí);但在JVM中,一個(gè)類用其全限定類名和其類加載器作為其唯一標(biāo)識(shí)。例如,如果在pg的包中有一個(gè)名為Person的類,被類加載器ClassLoader的實(shí)例kl負(fù)責(zé)加載,則該P(yáng)erson類對(duì)應(yīng)的Class對(duì)象在JVM中表示為(Person.pg.kl)。這意味著兩個(gè)類加載器加載的同名類:(Person.pg.kl)和(Person.pg.kl2)是不同的、它們所加載的類也是完全不同、互不兼容的。

JVM預(yù)定義有三種類加載器,當(dāng)一個(gè) JVM啟動(dòng)的時(shí)候,Java開始使用如下三種類加載器:

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

下面程序可以獲得根類加載器所加載的核心類庫(kù),并會(huì)看到本機(jī)安裝的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());
 }
 }
}

分享標(biāo)題:java類加載機(jī)制和類加載器的使用方法-創(chuàng)新互聯(lián)
標(biāo)題URL:http://www.rwnh.cn/article48/doejep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、云服務(wù)器、ChatGPT虛擬主機(jī)、App開發(fā)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
北碚区| 奎屯市| 抚顺县| 宝鸡市| 昭平县| 建始县| 灵丘县| 五常市| 马尔康县| 南岸区| 鹤山市| 连平县| 晋江市| 玉环县| 微博| 四川省| 巫溪县| 广昌县| 灵宝市| 信宜市| 洞头县| 阿图什市| 宁夏| 深圳市| 泾阳县| 杭锦后旗| 藁城市| 鹤山市| 内黄县| 区。| 奎屯市| 资溪县| 澄迈县| 田林县| 宽城| 济宁市| 合川市| 滦平县| 孟州市| 大田县| 陆河县|