国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android---Class 對(duì)象在執(zhí)行引擎中的初始化過(guò)程

這篇具有很好參考價(jià)值的文章主要介紹了Android---Class 對(duì)象在執(zhí)行引擎中的初始化過(guò)程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一個(gè) class 文件被加載到內(nèi)存中的步驟如下圖所示:

Android---Class 對(duì)象在執(zhí)行引擎中的初始化過(guò)程,# Android進(jìn)階,android

裝載

?裝載是指 Java 虛擬機(jī)查找 .class 文件并生成字節(jié)流,然后根據(jù)字節(jié)流創(chuàng)建 java.lang.Class 對(duì)象的過(guò)程。

1. ClassLoader 通過(guò)一個(gè)類的全限定名包名+類名)來(lái)查找 .class 文件,并生成二進(jìn)制字節(jié)流。其中 class 字節(jié)碼文件的來(lái)源:1).class 文件;2)jar包,zip包;3)網(wǎng)絡(luò)的字節(jié)流。

2. 把 .class 文件的各個(gè)部分分別解析(parse)為 JVM 內(nèi)部特定的數(shù)據(jù)結(jié)構(gòu),并存儲(chǔ)在方法區(qū)。JVM 會(huì)將這些 .lcass 文件的結(jié)果轉(zhuǎn)換為 JVM 內(nèi)部運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。

3. 在內(nèi)存中創(chuàng)建一個(gè) java.lang.Class 類型的對(duì)象。程序在運(yùn)行過(guò)程中所有對(duì)該類的訪問(wèn)都通過(guò)這個(gè)類對(duì)象,也就是這個(gè) Class 類型的類對(duì)象是提供給外界訪問(wèn)該類的接口。

加載時(shí)機(jī)

隱式裝載:在程序運(yùn)行過(guò)程中,當(dāng)碰到通過(guò) new 等方式生成對(duì)象時(shí),系統(tǒng)會(huì)隱式調(diào)用 ClassLoader 去裝載對(duì)應(yīng)的 class 到內(nèi)存中。

顯示裝載:在編寫源代碼時(shí),主動(dòng)調(diào)用 Class.forName() 等方法也會(huì)進(jìn)行 class 裝載操作。

鏈接

鏈接過(guò)程分為3步:驗(yàn)證、準(zhǔn)備、解析

1. 驗(yàn)證

目的是為了確保.class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危及虛擬機(jī)本身的安全。
● 文件格式檢驗(yàn):檢驗(yàn)字節(jié)流是否符合class文件格式的規(guī)范,并且能被當(dāng)前版本的虛擬機(jī)處理
● 元數(shù)據(jù)檢驗(yàn):對(duì)字節(jié)碼描述的信息進(jìn)行語(yǔ)義分析,以保證其描述的內(nèi)容符合Java語(yǔ)言規(guī)范的要求
● 字節(jié)碼檢驗(yàn):通過(guò)數(shù)據(jù)流和控制流分析,確定程序語(yǔ)義是合法、符合邏輯的
● 符號(hào)引用檢驗(yàn):可以看作是對(duì)類自身以外(常量池中的各種符號(hào)引用)的信息進(jìn)行匹配性校驗(yàn)

2. 準(zhǔn)備

準(zhǔn)備的主要目的是為類中的靜態(tài)變量分配內(nèi)存,并為其設(shè)置“0值”。

public static int value = 100;

準(zhǔn)備階段,JVM 會(huì)為 value 分配內(nèi)存,并將其設(shè)置為0,而真正的值100 是在初始化階段設(shè)置。

public static final int value = 100;

有 final 關(guān)鍵字修飾的變量會(huì)在準(zhǔn)備階段分配內(nèi)存并設(shè)置值為100。

Java 中基本類型的默認(rèn)“0值”如下:

● 基本類型(int, long, short, char, byte, boolean, float, double)的默認(rèn)值為0;

● 引用類型默認(rèn)值是 null。

3. 解析

解析的任務(wù)是把常量池中的符號(hào)引用轉(zhuǎn)換為直接引用,也就是具體的內(nèi)存地址。在這一階段,JVM 會(huì)將常量池中的類、接口名、字段名、方法名等轉(zhuǎn)換為具體的內(nèi)存地址。

初始化

初始化這一階段是執(zhí)行類構(gòu)造器<cinit>方法的過(guò)程,并真正初始化類變量。例如

public static int value = 100;

在準(zhǔn)備階段,JVM 會(huì)為 value 分配內(nèi)存,并將其設(shè)置為0,而真正的值100 是在初始化階段設(shè)置。

初始化的時(shí)機(jī)

JVM規(guī)范中嚴(yán)格規(guī)定了class初始化的時(shí)機(jī),主要有以下幾種情況會(huì)觸發(fā)class的初始化:
1. 虛擬機(jī)啟動(dòng)時(shí),初始化包含main方法的主類
2. 遇到new指令創(chuàng)建對(duì)象實(shí)例時(shí),如果目標(biāo)對(duì)象類沒(méi)有被初始化則進(jìn)行初始化操作
3. 當(dāng)遇到訪問(wèn)靜態(tài)方法或者靜態(tài)字段的指令時(shí),如果目標(biāo)對(duì)象類沒(méi)有被初始化則進(jìn)行初始化操作
4. 子類的初始化過(guò)程如果發(fā)現(xiàn)其父類還沒(méi)有進(jìn)行過(guò)初始化,則需要先觸發(fā)其父類的初始化
5. 使用反射API進(jìn)行反射調(diào)用時(shí),如果類沒(méi)有進(jìn)行過(guò)初始化則需要先觸發(fā)其初始化
6. 第一次調(diào)用java.lang.invoke.MethodHandle實(shí)例時(shí)需要初始化MethodHandle指向方法所在的類

初始化類變量

在初始化階段,只會(huì)初始化與類相關(guān)的靜態(tài)賦值語(yǔ)句靜態(tài)語(yǔ)句,也就是有 static 關(guān)鍵字修飾的信息。沒(méi)有 static 修飾的語(yǔ)句塊在實(shí)例化對(duì)象的時(shí)候才會(huì)執(zhí)行。

Class 初始化和對(duì)象的創(chuàng)建順序

面試題:在代碼中使用 new 創(chuàng)建一個(gè)類的實(shí)例對(duì)象時(shí),類中的靜態(tài)代碼塊、非靜態(tài)代碼塊、構(gòu)造函數(shù)之間的執(zhí)行順序是怎樣的?

對(duì)象的初始化順序:靜態(tài)變量/靜態(tài)代碼塊 -->? 普通代碼塊 --> 構(gòu)造函數(shù)

1. 父類靜態(tài)變量和靜態(tài)代碼塊
2. 子類靜態(tài)變量和靜態(tài)代碼塊
3. 父類普通成員變量和普通代碼塊
4. 父類的構(gòu)造函數(shù)
5. 子類普通成員變量和普通代碼塊
6. 子類的構(gòu)造函數(shù)

總結(jié)
1. 裝載:指查找字節(jié)流,并根據(jù)此字節(jié)流創(chuàng)建類的過(guò)程,裝載過(guò)程成功的標(biāo)志就是在方法區(qū)中成功創(chuàng)建了類所對(duì)應(yīng)的 Class 對(duì)象。

2. 鏈接:指驗(yàn)證創(chuàng)建的類,并將其解析到 JVM 中使之能夠被 JVM 執(zhí)行。

3. 初始化:是將標(biāo)記為 static 的字段進(jìn)行賦值,并且執(zhí)行 static 標(biāo)記的代碼語(yǔ)句。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-727596.html

到了這里,關(guān)于Android---Class 對(duì)象在執(zhí)行引擎中的初始化過(guò)程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java集合類型對(duì)象的快速初始化

    在Java中, 集合類型的對(duì)象初始化, 一般是先創(chuàng)建對(duì)象, 然后往集合里面增加元素,這種寫法直觀,但是撰寫代碼的時(shí)候感覺(jué)比較冗余, 是否有什么酷炫的方式簡(jiǎn)化定義初始化呢? 本篇介紹字符串?dāng)?shù)組、List 和 Map類型對(duì)象的定義初始化簡(jiǎn)單方式。 常用的寫法: 簡(jiǎn)化的寫法

    2024年02月06日
    瀏覽(41)
  • 一文詳解 springboot 項(xiàng)目啟動(dòng)時(shí)異步執(zhí)行初始化邏輯

    你知道的越多,你不知道的越多 點(diǎn)贊再看,養(yǎng)成習(xí)慣 如果您有疑問(wèn)或者見解,歡迎指教: 企鵝:869192208 前言 前面的工作中,為了提高地區(qū)數(shù)據(jù)的響應(yīng)時(shí)間,需要加載全國(guó)區(qū)劃數(shù)據(jù)到 redis 中緩存起來(lái),這個(gè)過(guò)程希望在項(xiàng)目時(shí)啟動(dòng)。 由于初始化全國(guó)區(qū)劃到 redis 中這個(gè)過(guò)程是

    2024年02月12日
    瀏覽(25)
  • 【C++基礎(chǔ)(六)】類和對(duì)象(下)--初始化列表,友元,匿名對(duì)象

    【C++基礎(chǔ)(六)】類和對(duì)象(下)--初始化列表,友元,匿名對(duì)象

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:C++初階之路? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)C++ ? ???? 關(guān)于類和對(duì)象的大致內(nèi)容已經(jīng)結(jié)束 本篇文章主要是介紹一些冗雜的細(xì)節(jié) 雖然本節(jié)的內(nèi)容屬于對(duì)類和對(duì)象錦上添花 但在很多特定的場(chǎng)所下,還是

    2024年02月14日
    瀏覽(36)
  • 【C++基礎(chǔ)】類與對(duì)象(下) 初始化列表、友元、內(nèi)部類、匿名對(duì)象

    【C++基礎(chǔ)】類與對(duì)象(下) 初始化列表、友元、內(nèi)部類、匿名對(duì)象

    ???內(nèi)容專欄: C/C++編程 ??本文概括: C++基礎(chǔ)語(yǔ)法。初始化列表、 explicit 、 static 成員、友元、內(nèi)部類、匿名對(duì)象、拷貝對(duì)象時(shí)的一些編譯器優(yōu)化等。 ??本文作者: 阿四啊 ??發(fā)布時(shí)間:2023.9.8 在創(chuàng)建對(duì)象時(shí),編譯器通過(guò)調(diào)用構(gòu)造函數(shù),給對(duì)象中各個(gè)成員變量一個(gè)

    2024年02月09日
    瀏覽(57)
  • Unity WebGL通過(guò)URL的形式接收參數(shù)執(zhí)行初始化

    Unity WebGL通過(guò)URL的形式接收參數(shù)執(zhí)行初始化

    參考博客: http://t.csdnimg.cn/QnfhK 需要在外面的網(wǎng)頁(yè)指定WebGL的打開初始化邏輯。 1.配置jslib,用文本文件創(chuàng)建即可,\\\"__Internal.jslib\\\"。 2.加入一段代碼: 3.場(chǎng)景掛一個(gè)腳本,引用這個(gè)代碼。 4.url中末尾用?輸入需要傳輸?shù)膬?nèi)容,能夠傳遞。

    2024年01月23日
    瀏覽(26)
  • Vue 先初始化父組件再初始化子組件的方法(自定義父子組件mounted執(zhí)行順序)

    寫在前面: 本篇內(nèi)容內(nèi)容主要講述了,在使用 Konva 進(jìn)行開發(fā)過(guò)程中遇到的一些問(wèn)題。(既然是組件加載順序,主要牽扯到的就是,父子組件的關(guān)系,父子組件的生命周期) 眾所周知, Vue 中父子組件生命周期的執(zhí)行順序?yàn)椋?然而,在某些情況下我們有其他需求,例如我們不

    2024年02月12日
    瀏覽(26)
  • 常見問(wèn)題03:SpringBoot項(xiàng)目啟動(dòng)初始化數(shù)據(jù)(執(zhí)行sql文件)

    常見問(wèn)題03:SpringBoot項(xiàng)目啟動(dòng)初始化數(shù)據(jù)(執(zhí)行sql文件)

    使用外部資源中定義的 SQL 腳本填充、初始化或清理數(shù)據(jù)庫(kù)。 調(diào)用addScript(org.springframework.core.io.Resource)以添加單個(gè) SQL 腳本位置。 調(diào)用addScripts(org.springframework.core.io.Resource…)以添加多個(gè) SQL 腳本位置。 請(qǐng)參閱此類中的 setter 方法以獲取更多配置選項(xiàng)。 調(diào)用populate(java.sql.Connect

    2024年02月13日
    瀏覽(34)
  • Android 9 藍(lán)牙協(xié)議初始化

    Android 9 藍(lán)牙協(xié)議初始化

    先講一下Application類的使用 要使用自定義的Application,首先就是要自己新建一個(gè)Application的子類,然后把它的名字寫在manifest文件里面的application標(biāo)簽里的android:name屬性就行,如我的Application子類名字是BaseApplication,則: 1. 初始化資源 由于Application類是在APP啟動(dòng)的時(shí)候就啟動(dòng),

    2024年02月11日
    瀏覽(29)
  • Android 11屬性系統(tǒng)初始化流程

    Android 11屬性系統(tǒng)初始化流程

    在init進(jìn)程啟動(dòng)的第二階段,調(diào)用PropertyInit 對(duì)屬性系統(tǒng)進(jìn)行初始化 PropertyInit函數(shù)在systemcoreinitproperty_service.cpp 中實(shí)現(xiàn) 注釋1處在dev下創(chuàng)建__properties__文件夾。注釋2處會(huì)收集讀取各個(gè)分區(qū)下的property_contexts文件,將讀取到的信息系列化之后,寫到/dev/ properties /property_info文件中。

    2024年04月09日
    瀏覽(20)
  • android系列-init 初始化日志

    1.FirstStageMain 2.InitKernelLogging? 3.KernelLogger? 4.OpenKmsg?

    2024年02月02日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包