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

JAVA的反射機(jī)制你了解多少

 更新時(shí)間:2022年02月05日 11:20:58   作者:橘子惡霸280  
這篇文章主要為大家詳細(xì)介紹了JAVA的反射機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1、什么是反射?

在java開(kāi)發(fā)中有一個(gè)非常重要的概念就是java反射機(jī)制,也是java的重要特征之一。

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪(fǎng)問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的一種能力,通過(guò)反射可以調(diào)用私有方法和私有屬性,大部分框架也都是運(yùn)用反射原理的。

Reflection(反射)是被視為動(dòng)態(tài)語(yǔ)言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection API取得任何
類(lèi)的內(nèi)部信息,并能直接操作任意對(duì)象的內(nèi)部屬性及方法。

一個(gè)類(lèi)有多個(gè)組成部分,例如:成員變量、方法、構(gòu)造方法等,反射就是加載類(lèi),并解剖出類(lèi)的各個(gè)組成部分。

2、反射能夠干什么?

Java的反射機(jī)制它知道類(lèi)的基本結(jié)構(gòu),這種對(duì)Java類(lèi)結(jié)構(gòu)探知的能力,我們稱(chēng)為Java類(lèi)的“自審”。如eclipse中,一按點(diǎn),編譯工具就會(huì)自動(dòng)的把該對(duì)象能夠使用的所有的方法和屬性全部都列出來(lái),供用戶(hù)進(jìn)行選擇。這就是利用了Java反射的原理,是對(duì)我們創(chuàng)建對(duì)象的探知、自審。

反射能夠做到:

  • 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi);
  • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象;
  • 在運(yùn)行時(shí)判斷任意一個(gè)類(lèi)所具有的成員變量和方法;
  • 在運(yùn)行時(shí)獲取泛型信息;
  • 在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的成員變量和方法;
  • 在運(yùn)行是處理注解;
  • 生成動(dòng)態(tài)代理;

3、反射相關(guān)API 

  • java.lang.Class:反射的源頭
  • java.lang.reflect.Method:方法
  • java.lang.reflect.Field:屬性
  • java.lang.reflect.Constructor:構(gòu)造器…

4、Class類(lèi)的理解

(1)、介紹:

程序經(jīng)過(guò)javac.exe命令以后,會(huì)生成一個(gè)或多個(gè)字節(jié)碼文件(.class結(jié)尾)。接著我們使用java.exe命令對(duì)某個(gè)字節(jié)碼文件進(jìn)行解釋運(yùn)行。相當(dāng)于將某個(gè)字節(jié)碼文件加載到內(nèi)存中。此過(guò)程就稱(chēng)為類(lèi)的加載。加載到內(nèi)存中的類(lèi),我們就稱(chēng)為運(yùn)行時(shí)類(lèi),此運(yùn)行時(shí)類(lèi),就作為Class的一個(gè)實(shí)例。

換句話(huà)說(shuō),Class的實(shí)例就對(duì)應(yīng)著一個(gè)運(yùn)行時(shí)類(lèi)。

加載到內(nèi)存中的運(yùn)行時(shí)類(lèi),會(huì)緩存一定的時(shí)間。在此時(shí)間之內(nèi),我們可以通過(guò)不同的方式
來(lái)獲取此運(yùn)行時(shí)類(lèi)。

(2)、類(lèi)的加載過(guò)程:

①加載:

在我們new對(duì)象或者使用Class.forName("包名.類(lèi)")時(shí)類(lèi)加載器(ClassLoader)會(huì)將類(lèi)加載到內(nèi)存中,并且創(chuàng)建一個(gè)Class對(duì)象

如何獲取Class對(duì)象?

JAVA

  • 類(lèi).class
  • 對(duì)象.getClass()
  • Class.forName(“包名.類(lèi)”);

②鏈接:

鏈接所做的工作主要是驗(yàn)證字節(jié)碼是否合法,為static 分配內(nèi)存空間并且初始化(并非真正的初始化,只是將對(duì)應(yīng)類(lèi)型的變量給上默認(rèn)值,比如int給0,double給0.0),解析

③初始化

真正的初始化

④使用

類(lèi)的正常使用

⑤卸載

從內(nèi)存中卸載(不需要我們關(guān)心何時(shí)卸載,由JVM去做)

(3)類(lèi)加載器

類(lèi)(CLASS) 只有被加載到 JVM 中后才能運(yùn)行。當(dāng)運(yùn)行指定程序時(shí),JVM會(huì)將編譯生成的.class文件按照需求和一定的規(guī)則加載到內(nèi)存中,組織成為一個(gè)完整的Java應(yīng)用程序。這個(gè)加載的過(guò)程是由類(lèi)加載器來(lái)完成的,具體來(lái)說(shuō),就是由ClassLoader和它的子類(lèi)來(lái)實(shí)現(xiàn)的。類(lèi)加載器本身也是一個(gè)類(lèi),其實(shí)質(zhì)是把類(lèi)文件從硬盤(pán)讀取到內(nèi)存中!

類(lèi)加載器的分類(lèi):

1.BootStrap:主要負(fù)責(zé)加載核心的類(lèi)庫(kù)(java.lang.*等),構(gòu)造ExtClassLoaderAPPClassLoader;

2.ExtClassLoader:主要負(fù)責(zé)加載jre/lib/ext目錄下的一些擴(kuò)展的jar包;

3.AppClassLoader:主要負(fù)責(zé)加載應(yīng)用程序的主函數(shù)類(lèi)(自己編寫(xiě)的java文件是這個(gè)類(lèi)加載器加載的);

System.out.println("app:" + System.getProperty("java.class.path"));
System.out.println("ext:" + System.getProperty("java.ext.dirs"));
System.out.println("----bootstrap---");
String[] str = System.getProperty("sun.boot.class.path").split(";");

for (String s : str) {
    System.out.println(s);
}

雙親委托(派)機(jī)制:

img

當(dāng)一個(gè)Hello.class這樣的文件要被加載時(shí)。不考慮我們自定義類(lèi)加載器,首先會(huì)在AppClassLoader中檢查是否加載過(guò),如果有那就無(wú)需再加載了。如果沒(méi)有,那么會(huì)拿到父加載器,然后調(diào)用父加載器的loadClass方法。父類(lèi)中同理也會(huì)先檢查自己是否已經(jīng)加載過(guò),如果沒(méi)有再往上。注意這個(gè)類(lèi)似遞歸的過(guò)程,直到到達(dá)Bootstrap classLoader之前,都是在檢查是否加載過(guò),并不會(huì)選擇自己去加載。直到BootstrapClassLoader,已經(jīng)沒(méi)有父加載器了,這時(shí)候開(kāi)始考慮自己是否能加載了,如果自己無(wú)法加載,會(huì)下沉到子加載器去加載,一直到最底層,如果沒(méi)有任何加載器能加載,就會(huì)拋出ClassNotFoundException。那么有人就有下面這種疑問(wèn)了?

為什么要設(shè)計(jì)這種機(jī)制

這種設(shè)計(jì)有個(gè)好處是,如果有人想替換系統(tǒng)級(jí)別的類(lèi):String.java。篡改它的實(shí)現(xiàn),在這種機(jī)制下這些系統(tǒng)的類(lèi)已經(jīng)被Bootstrap classLoader加載過(guò)了(為什么?因?yàn)楫?dāng)一個(gè)類(lèi)需要加載的時(shí)候,最先去嘗試加載的就是BootstrapClassLoader),所以其他類(lèi)加載器并沒(méi)有機(jī)會(huì)再去加載,從一定程度上防止了危險(xiǎn)代碼的植入。

總結(jié)

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

相關(guān)文章

  • Spring將MultipartFile轉(zhuǎn)存到本地磁盤(pán)的三種方式

    Spring將MultipartFile轉(zhuǎn)存到本地磁盤(pán)的三種方式

    在Java中處理文件向來(lái)是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來(lái)處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤(pán)的方式,需要的朋友可以參考下
    2024-10-10
  • mybatisPlus更新策略導(dǎo)致更新失敗問(wèn)題

    mybatisPlus更新策略導(dǎo)致更新失敗問(wèn)題

    這篇文章主要介紹了mybatisPlus更新策略導(dǎo)致更新失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 如何在SpringBoot中使用Spring-AOP實(shí)現(xiàn)接口鑒權(quán)

    如何在SpringBoot中使用Spring-AOP實(shí)現(xiàn)接口鑒權(quán)

    這篇文章主要介紹了如何在SpringBoot中使用Spring-AOP實(shí)現(xiàn)接口鑒權(quán),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • springboot中使用自定義兩級(jí)緩存的方法

    springboot中使用自定義兩級(jí)緩存的方法

    這篇文章主要介紹了springboot中使用自定義兩級(jí)緩存的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • swing登錄注冊(cè)界面設(shè)計(jì)

    swing登錄注冊(cè)界面設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了swing登錄注冊(cè)界面的設(shè)計(jì)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 關(guān)于Java的二叉樹(shù)、紅黑樹(shù)、B+樹(shù)詳解

    關(guān)于Java的二叉樹(shù)、紅黑樹(shù)、B+樹(shù)詳解

    這篇文章主要介紹了關(guān)于Java的二叉樹(shù)、紅黑樹(shù)、B+樹(shù)詳解,能同時(shí)具備數(shù)組查找快的優(yōu)點(diǎn)以及鏈表插入和刪除快的優(yōu)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)就是樹(shù),需要的朋友可以參考下
    2023-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較

    Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較

    比較對(duì)象是面向?qū)ο缶幊陶Z(yǔ)言的一個(gè)基本特征,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析

    Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析

    這篇文章主要介紹了Java排序算法三之歸并排序的遞歸與非遞歸的實(shí)現(xiàn)示例解析,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)

    spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)

    本篇文章主要介紹了spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • 解讀RedisTemplate的各種操作(set、hash、list、string)

    解讀RedisTemplate的各種操作(set、hash、list、string)

    這篇文章主要介紹了解讀RedisTemplate的各種操作(set、hash、list、string),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

牟定县| 沈丘县| 法库县| 上林县| 晋城| 关岭| 南昌县| 林口县| 酉阳| 邯郸县| 凤冈县| 石家庄市| 晋州市| 天峨县| 陕西省| 定南县| 博客| 陵川县| 怀来县| 永靖县| 湖口县| 融水| 策勒县| 仁怀市| 焉耆| 德兴市| 邢台县| 扬州市| 稷山县| 眉山市| 雷波县| 江山市| 沛县| 东丽区| 桂平市| 连平县| 清丰县| 清河县| 钦州市| 鄯善县| 招远市|