最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你深入了解Java類(lèi)加載

 更新時(shí)間:2021年08月02日 11:51:11   作者:Serendipity sn  
這篇文章主要介紹了Java中類(lèi)加載過(guò)程全面解析,具有一定參考價(jià)值,需要的朋友可以了解下,希望能給你帶來(lái)幫助

1.類(lèi)加載

<1>.父子類(lèi)執(zhí)行的順序

1.父類(lèi)的靜態(tài)變量和靜態(tài)代碼塊(書(shū)寫(xiě)順序)

2.子類(lèi)的靜態(tài)變量和靜態(tài)代碼塊(書(shū)寫(xiě)順序)

3.父類(lèi)的實(shí)例代碼塊(書(shū)寫(xiě)順序)

4.父類(lèi)的成員變量和構(gòu)造方法

5.子類(lèi)的實(shí)例代碼塊

6.子類(lèi)的成員變量和構(gòu)造方法

<2>類(lèi)加載的時(shí)機(jī)

如果類(lèi)沒(méi)有進(jìn)行初始化,則需要先進(jìn)行初始化,虛擬機(jī)規(guī)范則是嚴(yán)格規(guī)定有且只有5種情況必須先對(duì)類(lèi)進(jìn)行初始化(而加載,驗(yàn)證,準(zhǔn)備要在這個(gè)之前開(kāi)始)

1.創(chuàng)建類(lèi)的實(shí)例(new的方式),訪問(wèn)某個(gè)類(lèi)的靜態(tài)變量,或者對(duì)該靜態(tài)變量賦值,調(diào)用類(lèi)的靜態(tài)方法

2.反射的方式

3.初始化某個(gè)類(lèi)的子類(lèi),則其父類(lèi)也會(huì)被初始化

4.java虛擬機(jī)啟動(dòng)時(shí)被標(biāo)記為啟動(dòng)類(lèi)的類(lèi),直接使用java.exe來(lái)運(yùn)行的某個(gè)主類(lèi)(如main類(lèi))

5.使用jdk1.7的動(dòng)態(tài)語(yǔ)言支持時(shí)

<3>類(lèi)的生命周期

七個(gè)階段:加載,驗(yàn)證,準(zhǔn)備,解析,初始化,使用和卸載。其中驗(yàn)證,準(zhǔn)備和解析三個(gè)部分被稱(chēng)為連接

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-CicgRzZ9-162(file:///C:/Users/26905/Desktop/%E6%AF%94%E7%89%B9%E8%AF%BE%E4%BB%B6/%E7%B1%BB%E5%8A%A0%E8%BD%BD_files/Image.png)]

解析階段在某些情況下可以在初始化階段之后再進(jìn)行,這是為了支持java語(yǔ)言的運(yùn)行時(shí)綁定(動(dòng)態(tài)綁定)

<4>類(lèi)加載的過(guò)程

接下來(lái)我們?cè)敿?xì)講解一下Java虛擬機(jī)中類(lèi)加載的全過(guò)程,也就是加載、驗(yàn)證、準(zhǔn)備、解析和初始化這5個(gè)階段所執(zhí)行的具體動(dòng)作。

1.加載

<1>通過(guò)一個(gè)類(lèi)的全限定名來(lái)獲取定義此類(lèi)的二進(jìn)制字節(jié)流。

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

<3>在內(nèi)存中生成一個(gè)代表這個(gè)類(lèi)的java.lang.Class對(duì)象,作為方法區(qū)這個(gè)類(lèi)的各種數(shù)據(jù)的訪問(wèn)入口。

2.驗(yàn)證

這一階段的目的是為了確保Class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全。

3.準(zhǔn)備

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

假設(shè)一個(gè)類(lèi)變量的定義為:

public static int value=123;

那變量value在準(zhǔn)備階段過(guò)后的初始值為0而不是123,因?yàn)檫@時(shí)候尚未開(kāi)始執(zhí)行任何Java方法,而把value賦值為123的putstatic指令是程序被編譯后,存放于類(lèi)構(gòu)造器()方法之中,所以把value賦值為123的動(dòng)作將在初始化階段才會(huì)執(zhí)行。

4.解析

虛擬機(jī)將常量池內(nèi)的符號(hào)引用替換為直接引用的過(guò)程。

符號(hào)引用:符號(hào)引用與虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局無(wú)關(guān),引用的目標(biāo)并不一定已經(jīng)加載到內(nèi)存中。

直接引用:直接引用是和虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局相關(guān)的。如果有了直接引用,那引用的目標(biāo)必定已經(jīng)在內(nèi)存中存在。

5.初始化

在準(zhǔn)備階段,變量已經(jīng)賦過(guò)一次系統(tǒng)要求的初始值,而在初始化階段,則根據(jù)程序員通過(guò)程序制定的主觀計(jì)劃去初始化類(lèi)變量和其他資源,或者可以從另外一個(gè)角度來(lái)表達(dá):初始化階段是執(zhí)行類(lèi)構(gòu)造器()方法的過(guò)程。

了解:

()方法是由編譯器自動(dòng)收集類(lèi)中的所有類(lèi)變量的賦值動(dòng)作和靜態(tài)語(yǔ)句塊(static{}塊)中的語(yǔ)句合并產(chǎn)生的,編譯器收集的順序是由語(yǔ)句在源文件中出現(xiàn)的順序所決定的,靜態(tài)語(yǔ)句塊中只能訪問(wèn)到定義在靜態(tài)語(yǔ)句塊之前的變量,定義在它之后的變量,在前面的靜態(tài)語(yǔ)句塊可以賦值,但是不能訪問(wèn):

public class Test{
    static{
        i=0; //給變量賦值可以正常編譯通過(guò)
        System.out.print(i); //這句編譯器會(huì)提示"非法向前引用"
    }
    static int i=1;
}

1.()方法(Class類(lèi)的構(gòu)造方法)與類(lèi)的構(gòu)造函數(shù)(或者說(shuō)實(shí)例構(gòu)造器()方法)不同,它不需要顯式地調(diào)用父類(lèi)構(gòu)造器,虛擬機(jī)會(huì)保證在子類(lèi)的()方法執(zhí)行之前,父類(lèi)的()方法已經(jīng)執(zhí)行完畢。因此在虛擬機(jī)中第一個(gè)被執(zhí)行的()方法的類(lèi)肯定是java.lang.Object。

2.()方法對(duì)于類(lèi)或接口來(lái)說(shuō)并不是必需的,如果一個(gè)類(lèi)中沒(méi)有靜態(tài)語(yǔ)句塊,也沒(méi)有對(duì)變量的賦值操作,那么編譯器可以不為這個(gè)類(lèi)生成()方法。

3.接口中定義的變量使用時(shí),接口才會(huì)初始化:接口中不能使用靜態(tài)語(yǔ)句塊,但仍然有變量初始化的賦值操作,因此接口與類(lèi)一樣都會(huì)生()方法。但接口與類(lèi)不同的是,執(zhí)行接口的()方法不需要先執(zhí)行父接口的()方法。只有當(dāng)父接口中定義的變量使用時(shí),父接口才會(huì)初始化。另外,接口的實(shí)現(xiàn)類(lèi)在初始化時(shí)也一樣不會(huì)執(zhí)行接口的()方法。

4.虛擬機(jī)會(huì)保證一個(gè)類(lèi)的()方法在多線(xiàn)程環(huán)境中被正確地加鎖、同步,如果多個(gè)線(xiàn)程同時(shí)去初始化一個(gè)類(lèi),那么只會(huì)有一個(gè)線(xiàn)程去執(zhí)行這個(gè)類(lèi)的()方法,其他線(xiàn)程都需要阻塞等待,直到活動(dòng)線(xiàn)程執(zhí)行()方法完畢。如果在一個(gè)類(lèi)的()方法中有耗時(shí)很長(zhǎng)的操作,就可能造成多個(gè)進(jìn)程阻塞,在實(shí)際應(yīng)用中這種阻塞往往是很隱蔽的。

<5>類(lèi)加載器

類(lèi)加載器可以分為:?jiǎn)?dòng)類(lèi)加載器、擴(kuò)展類(lèi)加載器、應(yīng)用程序類(lèi)加載器、自定義類(lèi)加載器。他們的關(guān)系一般如下:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-sVRciBVN-1627452314592)(C:\Users\26905\AppData\Roaming\Typora\typora-user-images\image-20210728134416563.png)]

1.啟動(dòng)類(lèi)加載器(BootstrapClassLoader)

這個(gè)類(lèi)由C++語(yǔ)言實(shí)現(xiàn),是虛擬機(jī)自身的一部分,并不繼承ClassLoader,不能操作它。用來(lái)加載Java的核心類(lèi)。

2.擴(kuò)展類(lèi)加載器(ExtClassLoader)

這個(gè)類(lèi)加載器是在類(lèi)sun.misc.Launcher$ExtClassLoader中以Java代碼的形式實(shí)現(xiàn)的。它負(fù)責(zé)加載<JAVA_HOME>\lib\ext目錄中,或者被java.ext.dirs系統(tǒng)變量所指定的路徑中所有的類(lèi)庫(kù)。

3.應(yīng)用程序類(lèi)加載器(AppClassLoader)

它負(fù)責(zé)在 JVM 啟動(dòng)時(shí)加載來(lái)自 Java 命令的 -classpath 或者 -cp 選項(xiàng)、java.class.path 系統(tǒng)屬性指定的 jar 包和類(lèi)路徑。在應(yīng)用程序代碼里可以通過(guò) ClassLoader 的靜態(tài)方法 getSystemClassLoader() 來(lái)獲取應(yīng)用類(lèi)加載器。如果沒(méi)有特別指定,則在沒(méi)有使用自定義類(lèi)加載器情況下,用戶(hù)自定義的類(lèi)都由此加載器加載。

4.2 自定義加載器

用戶(hù)自定義了類(lèi)加載器,則自定義類(lèi)加載器都以應(yīng)用類(lèi)加載器作為父加載器。應(yīng)用類(lèi)加載器的父類(lèi)加載器為擴(kuò)展類(lèi)加載器。這些類(lèi)加載器是有層次關(guān)系的,啟動(dòng)加載器又叫根加載器,是擴(kuò)展加載器的父加載器

<6>類(lèi)加載機(jī)制——雙親委派模型

雙親委派模型的過(guò)程:如果一個(gè)類(lèi)加載器收到了類(lèi)加載的請(qǐng)求,它首先不會(huì)自己嘗試加載這個(gè)類(lèi),而是把這個(gè)請(qǐng)求委派給父類(lèi)加載器去完成,每一層次的類(lèi)加載器都是如此,因此所有的加載請(qǐng)求信息最終都會(huì)傳送到最頂層的啟動(dòng)類(lèi)加載器中,只有當(dāng)父加載器反饋?zhàn)约簾o(wú)法完成這個(gè)加載請(qǐng)求(即它的搜索范圍沒(méi)有找到所需要的類(lèi))時(shí),子加載器才會(huì)嘗試自己去完成加載

先查找,再進(jìn)行加載

(1)從下往上找

(2)從上往下加載

雙親委派模型的好處:雙親委派模型對(duì)于java程序的穩(wěn)定運(yùn)行極為重要

劣勢(shì):無(wú)法滿(mǎn)足靈活的類(lèi)加載方式。(解決方案:自己重寫(xiě)loadClass破壞雙親委派模型 例如SPI機(jī)制)

總結(jié)

本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • java Zookeeper簡(jiǎn)述

    java Zookeeper簡(jiǎn)述

    ZooKeeper是一個(gè)分布式的,開(kāi)放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開(kāi)源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。下面通過(guò)本文給大家分享java 中 zookeeper簡(jiǎn)單使用,需要的朋友參考下吧
    2021-09-09
  • JAVA對(duì)稱(chēng)加密算法PBE定義與用法實(shí)例分析

    JAVA對(duì)稱(chēng)加密算法PBE定義與用法實(shí)例分析

    這篇文章主要介紹了JAVA對(duì)稱(chēng)加密算法PBE定義與用法,結(jié)合實(shí)例形式分析了JAVA對(duì)稱(chēng)加密算法PBE的概念、原理、定義及使用方法,需要的朋友可以參考下
    2019-09-09
  • 單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法

    單點(diǎn)登錄的概念及SpringBoot實(shí)現(xiàn)單點(diǎn)登錄的操作方法

    在本文中,我們將使用Spring Boot構(gòu)建一個(gè)基本的單點(diǎn)登錄系統(tǒng),我們將介紹如何使用Spring Security和JSON Web Tokens(JWTs)來(lái)實(shí)現(xiàn)單點(diǎn)登錄功能,本文假設(shè)您已經(jīng)熟悉Spring Boot和Spring Security,感興趣的朋友一起看看吧
    2024-10-10
  • mongo分布式鎖Java實(shí)現(xiàn)方法(推薦)

    mongo分布式鎖Java實(shí)現(xiàn)方法(推薦)

    下面小編就為大家?guī)?lái)一篇mongo分布式鎖Java實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • SpringBoot中注解@AliasFor的使用詳解

    SpringBoot中注解@AliasFor的使用詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中注解@AliasFor的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-05-05
  • Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議

    Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議

    這篇文章主要介紹了Mybatis學(xué)習(xí)總結(jié)之mybatis使用建議的相關(guān)資料,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-05-05
  • Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析

    Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析

    這篇文章主要為大家介紹了Map映射LinkedHashSet與LinkedHashMap的應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步
    2022-03-03
  • IDEA2022性能優(yōu)化的一些設(shè)置技巧

    IDEA2022性能優(yōu)化的一些設(shè)置技巧

    這篇文章主要介紹了IDEA2022性能優(yōu)化的一些設(shè)置,需要的朋友可以參考下
    2022-08-08
  • springboot如何解決非controller類(lèi)引用service的問(wèn)題

    springboot如何解決非controller類(lèi)引用service的問(wèn)題

    這篇文章主要介紹了springboot如何解決非controller類(lèi)引用service的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JavaWeb開(kāi)發(fā)中alias攔截器的使用方法

    JavaWeb開(kāi)發(fā)中alias攔截器的使用方法

    本文給大家介紹在JavaWeb開(kāi)發(fā)中alias攔截器的使用方法相關(guān)知識(shí),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08

最新評(píng)論

北碚区| 麻城市| 宽城| 壶关县| 大港区| 杭锦旗| 天水市| 高邑县| 兖州市| 武定县| 通城县| 梁平县| 仪征市| 德安县| 城步| 济宁市| 砚山县| 井陉县| 嘉义市| 三河市| 三明市| 咸丰县| 钦州市| 南丹县| 清新县| 广元市| 临武县| 揭阳市| 靖边县| 临清市| 兴文县| 响水县| 静宁县| 泰顺县| 黄梅县| 陵水| 通山县| 呈贡县| 永济市| 大关县| 武强县|