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

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

深入淺析java中的類加載機(jī)制和反射機(jī)制-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)公司主營涿鹿網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā),涿鹿h5重慶小程序開發(fā)公司搭建,涿鹿網(wǎng)站營銷推廣歡迎涿鹿等地區(qū)企業(yè)咨詢

深入淺析java 中的類加載機(jī)制和反射機(jī)制?針對這個(gè)問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡單易行的方法。

一、Java類加載機(jī)制

1.概述

       Class文件由類裝載器裝載后,在JVM中將形成一份描述Class結(jié)構(gòu)的元信息對象,通過該元信息對象可以獲知Class的結(jié)構(gòu)信息:如構(gòu)造函數(shù),屬性和方法等,Java允許用戶借由這個(gè)Class相關(guān)的元信息對象間接調(diào)用Class對象的功能。

      虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行校驗(yàn),轉(zhuǎn)換解析和初始化,最終形成可以被虛擬機(jī)直接使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。

2.工作機(jī)制

      類裝載器就是尋找類的字節(jié)碼文件,并構(gòu)造出類在JVM內(nèi)部表示的對象組件。在Java中,類裝載器把一個(gè)類裝入JVM中,要經(jīng)過以下步驟:

     (1) 裝載:查找和導(dǎo)入Class文件;

     (2) 鏈接:把類的二進(jìn)制數(shù)據(jù)合并到JRE中;

        (a)校驗(yàn):檢查載入Class文件數(shù)據(jù)的正確性;

        (b)準(zhǔn)備:給類的靜態(tài)變量分配存儲(chǔ)空間;

        (c)解析:將符號引用轉(zhuǎn)成直接引用;

     (3) 初始化:對類的靜態(tài)變量,靜態(tài)代碼塊執(zhí)行初始化操作

深入淺析java 中的類加載機(jī)制和反射機(jī)制

       Java程序可以動(dòng)態(tài)擴(kuò)展是由運(yùn)行期動(dòng)態(tài)加載和動(dòng)態(tài)鏈接實(shí)現(xiàn)的;比如:如果編寫一個(gè)使用接口的應(yīng)用程序,可以等到運(yùn)行時(shí)再指定其實(shí)際的實(shí)現(xiàn)(多態(tài)),解析過程有時(shí)候還可以在初始化之后執(zhí)行;比如:動(dòng)態(tài)綁定(多態(tài));       

      【類初始化】

      (1) 遇到new、getstatic、putstatic或invokestatic這4條字節(jié)碼指令時(shí),如果類沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化。生成這4條指令的最常見的Java代碼場景是:使用new關(guān)鍵字實(shí)例化對象的時(shí)候,讀取或設(shè)置一個(gè)類的靜態(tài)字段(被final修飾、已在編譯期把結(jié)果放入常量池的靜態(tài)字段除外)的時(shí)候,以及調(diào)用一個(gè)類的靜態(tài)方法的時(shí)候。

      (2) 使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用的時(shí)候,如果類沒有進(jìn)行過初始化,則需要先觸發(fā)其初始化。

      (3) 當(dāng)初始化一個(gè)類的時(shí)候,如果發(fā)現(xiàn)其父類還沒有進(jìn)行過初始化,則需要先觸發(fā)其父類的初始化。

      (4)當(dāng)虛擬機(jī)啟動(dòng)時(shí),用戶需要指定一個(gè)要執(zhí)行的主類(包含main()方法的那個(gè)類),虛擬機(jī)會(huì)先初始化這個(gè)主類。

只有上述四種情況會(huì)觸發(fā)初始化,也稱為對一個(gè)類進(jìn)行主動(dòng)引用,除此以外,所有其他方式都不會(huì)觸發(fā)初始化,稱為被動(dòng)引用

代碼清單1

深入淺析java 中的類加載機(jī)制和反射機(jī)制

 上述代碼運(yùn)行后,只會(huì)輸出【---SuperClass init】, 而不會(huì)輸出【SubClass init】,對于靜態(tài)字段,只有直接定義這個(gè)字段的類才會(huì)被初始化,因此,通過子類來調(diào)用父類的靜態(tài)字段,只會(huì)觸發(fā)父類的初始化,但是這是要看不同的虛擬機(jī)的不同實(shí)現(xiàn)。

代碼清單2

深入淺析java 中的類加載機(jī)制和反射機(jī)制

 此處不會(huì)引起SuperClass的初始化,但是卻觸發(fā)了【[Ltest.SuperClass】的初始化,通過arr.toString()可以看出,對于用戶代碼來說,這不是一個(gè)合法的類名稱,它是由虛擬機(jī)自動(dòng)生成的,直接繼承于Object的子類,創(chuàng)建動(dòng)作由字節(jié)碼指令newarray觸發(fā),此時(shí)數(shù)組越界檢查也會(huì)伴隨數(shù)組對象的所有調(diào)用過程,越界檢查并不是封裝在數(shù)組元素訪問的類中,而是封裝在數(shù)組訪問的xaload,xastore字節(jié)碼指令中.

代碼清單3

深入淺析java 中的類加載機(jī)制和反射機(jī)制

 對常量ConstClass.value 的引用實(shí)際都被轉(zhuǎn)化為NotInitialization類對自身常量池的引用,這兩個(gè)類被編譯成class后不存在任何聯(lián)系。

          【裝載】

    在裝載階段,虛擬機(jī)需要完成以下3件事情

        (1) 通過一個(gè)類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流

        (2) 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)

        (3) 在Java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對象,作為方法區(qū)這些數(shù)據(jù)的訪問入口。

    虛擬機(jī)規(guī)范中并沒有準(zhǔn)確說明二進(jìn)制字節(jié)流應(yīng)該從哪里獲取以及怎樣獲取,這里可以通過定義自己的類加載器去控制字節(jié)流的獲取方式。        

         【驗(yàn)證】

    虛擬機(jī)如果不檢查輸入的字節(jié)流,對其完全信任的話,很可能會(huì)因?yàn)檩d入了有害的字節(jié)流而導(dǎo)致系統(tǒng)奔潰。 

         【準(zhǔn)備】

    準(zhǔn)備階段是正式為類變量分配并設(shè)置類變量初始值的階段,這些內(nèi)存都將在方法區(qū)中進(jìn)行分配,需要說明的是:

這時(shí)候進(jìn)行內(nèi)存分配的僅包括類變量(被static修飾的變量),而不包括實(shí)例變量,實(shí)例變量將會(huì)在對象實(shí)例化時(shí)隨著對象一起分配在Java堆中;這里所說的初始值“通常情況”是數(shù)據(jù)類型的零值,假如:

public static int value = 123;

當(dāng)前名稱:深入淺析java中的類加載機(jī)制和反射機(jī)制-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://weahome.cn/article/cddohs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部