溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JAVA語(yǔ)言中的反射機(jī)制是什么

發(fā)布時(shí)間:2022-02-08 09:24:03 來源:億速云 閱讀:127 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“JAVA語(yǔ)言中的反射機(jī)制是什么”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“JAVA語(yǔ)言中的反射機(jī)制是什么”這篇文章吧。

    1、什么是反射?

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

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

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

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

    2、反射能夠干什么?

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

    反射能夠做到:

    • 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類;

    • 在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象;

    • 在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;

    • 在運(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類的理解

    (1)、介紹:

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

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

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

    (2)、類的加載過程:

    ①加載:

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

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

    JAVA

    • 類.class

    • 對(duì)象.getClass()

    • Class.forName(“包名.類”);

    ②鏈接:

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

    ③初始化

    真正的初始化

    ④使用

    類的正常使用

    ⑤卸載

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

    (3)類加載器

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

    類加載器的分類:

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

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

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

    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ī)制:

    JAVA語(yǔ)言中的反射機(jī)制是什么

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

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

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

    以上是“JAVA語(yǔ)言中的反射機(jī)制是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI