版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章Java的反射機(jī)制《Java基礎(chǔ)案例教程》(第3版)學(xué)習(xí)目標(biāo)/Target掌握Class類,能夠在程序中通過(guò)Class類的常用方法操作類的相關(guān)信息掌握基于反射操作修飾符和構(gòu)造方法,能夠通過(guò)Modifier類和Constructor類的常用方法操作修飾符和構(gòu)造方法了解Java的反射機(jī)制概述,能夠簡(jiǎn)述什么是反射機(jī)制掌握基于反射操作成員方法,能夠通過(guò)Method類的常用方法操作成員方法掌握基于反射操作成員變量,能夠通過(guò)Field類的常用方法操作成員變量章節(jié)概述/
Summary在之前的學(xué)習(xí)過(guò)程中,我們通常使用new關(guān)鍵字來(lái)創(chuàng)建類的實(shí)例。然而,在某些情景下這種方式無(wú)法滿足對(duì)應(yīng)的需求,例如,需要在程序運(yùn)行時(shí)根據(jù)條件動(dòng)態(tài)地創(chuàng)建對(duì)象時(shí),使用new關(guān)鍵字就無(wú)法實(shí)現(xiàn)。對(duì)此可以使用Java提供的反射機(jī)制。通過(guò)反射機(jī)制,開(kāi)發(fā)人員可以在運(yùn)行時(shí)動(dòng)態(tài)地獲取類的信息,進(jìn)而創(chuàng)建對(duì)象、調(diào)用方法等。本章將對(duì)Java的反射機(jī)制及其應(yīng)用進(jìn)行講解。目錄/Contents0102反射機(jī)制概述Class類03反射的常見(jiàn)操作反射機(jī)制概述11.111.1反射機(jī)制概述了解Java的反射機(jī)制概述,能夠簡(jiǎn)述什么是反射機(jī)制
先定一個(gè)小目標(biāo)!11.1反射機(jī)制概述反射在日常生活中是一種常見(jiàn)的物理現(xiàn)象,通過(guò)反射可以將一個(gè)虛像映射到實(shí)物,從而獲取實(shí)物的某些形態(tài)特征。例如,通過(guò)鏡子可以觀察到物體的形態(tài)。而在Java編程中,也提供了一種類似的機(jī)制,即反射機(jī)制。11.1反射機(jī)制概述Java程序的運(yùn)行過(guò)程主要分為兩個(gè)階段:編譯期和運(yùn)行期。編譯期主要完成了代碼的翻譯功能,并沒(méi)有將代碼加載到內(nèi)存中運(yùn)行。運(yùn)行期是指將編譯后的文件提交給計(jì)算機(jī)執(zhí)行,直到程序運(yùn)行結(jié)束。在這個(gè)階段,已經(jīng)編譯的代碼被加載到內(nèi)存中并開(kāi)始執(zhí)行。Java的反射機(jī)制允許在程序運(yùn)行期間動(dòng)態(tài)的獲取程序的信息,并調(diào)用對(duì)象的以下功能。構(gòu)造任意類的對(duì)象獲取任意對(duì)象所屬類的信息調(diào)用任意類的成員變量和方法獲取任意對(duì)象的屬性和方法11.1反射機(jī)制概述反射機(jī)制為軟件的維護(hù)和升級(jí)提供了便利,例如在大型軟件的開(kāi)發(fā)中,往往無(wú)法一次性將程序設(shè)計(jì)的完美無(wú)缺。當(dāng)程序已經(jīng)編譯并發(fā)布上線后,需要更新某些功能時(shí),如果采用靜態(tài)編譯,就需要重新編譯整個(gè)程序。然而如果使用反射機(jī)制,則能夠在程序運(yùn)行時(shí)動(dòng)態(tài)加載并執(zhí)行代碼,無(wú)需重新編譯整個(gè)程序,可以實(shí)現(xiàn)更靈活的功能更新。Class類11.211.2Class類掌握Class類,能夠在程序中通過(guò)Class類的常用方法操作類的相關(guān)信息
先定一個(gè)小目標(biāo)!11.2Class類在
Java程序運(yùn)行時(shí),JVM會(huì)先將拓展名為.java的源碼文件編譯成字節(jié)碼文件,即拓展名為.class的文件。JVM會(huì)將這些字節(jié)碼文件中的字節(jié)碼加載到內(nèi)存中,解析成JVM內(nèi)部使用的數(shù)據(jù)結(jié)構(gòu),并為每個(gè)類生成一個(gè)對(duì)應(yīng)的Class對(duì)象。Class對(duì)象中封裝了類的構(gòu)造方法、方法和屬性等信息。因此,要完成反射操作,首先需要先學(xué)習(xí)Class類的相關(guān)知識(shí)。11.2Class類Class是JDK提供的類,Class類提供了多個(gè)方法,可以用于操作類的相關(guān)信息。Class類的常用方法如下表所示。方法描述forName(StringclassName)用于加載指定名稱的類,并返回對(duì)應(yīng)的Class對(duì)象。傳入的類名需要包含完整的包名和類名getConstructors()用于獲取類中所有的公共構(gòu)造方法getConstructor(Class<?>...parameterTypes)用于獲取指定參數(shù)類型的公共構(gòu)造方法getDeclaredConstructors()用于獲取類中所有的構(gòu)造方法,包括私有的構(gòu)造方法getDeclaredConstructor(Class<?>...parameterTypes)用于獲取指定參數(shù)類型的構(gòu)造函數(shù)getDeclaredFields()用于獲取本類中聲明的所有屬性,包括私有屬性11.2Class類接上頁(yè)表格。方法描述getFields()用于獲取本類及其父類繼承而來(lái)的所有公共屬性getMethods()用于獲取本類及其父類繼承而來(lái)的所有公共方法getMethod(Stringname,Class...parameterType)用于根據(jù)方法名和參數(shù)類型獲取Method對(duì)象,只能獲得public修飾的Method對(duì)象getDeclaredMethods()用于獲取類聲明的所有方法,包括公共、私有方法和繼承等方法getDeclaredMethod(Stringname,Class<?>...parameterTypes)用于獲取具有指定名稱和參數(shù)類型的方法,包括公共方法、私有方法和繼承的方法getInterfaces()用于獲取類中實(shí)現(xiàn)的全部接口getClass()用于獲取調(diào)用方法的對(duì)象的Class對(duì)象getName()用于獲取包括包名和類名的完整類名11.2Class類接上頁(yè)表格。方法描述getSimpleName()用于獲取不包含包名的類的名稱getPackage()用于獲取類所屬的包名稱getSuperclass()用于獲取類的父類,只能獲取直接父類的
Class
對(duì)象newInstance()用于調(diào)用類的默認(rèn)構(gòu)造方法實(shí)例化一個(gè)Class對(duì)象,相當(dāng)于創(chuàng)建該類的一個(gè)實(shí)例對(duì)象getComponentType()用于獲取數(shù)組類型的Class對(duì)象isArray()用于判斷當(dāng)前Class對(duì)象是否是一個(gè)數(shù)組類型11.2Class類Class類本身沒(méi)有定義構(gòu)造方法,因此不能使用構(gòu)造方法實(shí)例化Class對(duì)象。獲取Class類對(duì)象的可以通過(guò)forName()方法和getClass()方法,也可以通過(guò)調(diào)用類的class屬性來(lái)獲取該類對(duì)應(yīng)的class對(duì)象。(1)通過(guò)forName()方法獲取Class對(duì)象ClassstuClass=Class.forName("com.itheima.Student");上述代碼中,com.itheima.Student為com.itheima包下Student類的完整路徑,該類需要是一個(gè)已存在的類,如果不存在,創(chuàng)建該類的Class對(duì)象時(shí)會(huì)拋出
ClassNotFoundException異常。11.2Class類(2)通過(guò)getClass()方法獲取Class對(duì)象ClassstuClass=newStudent().getClass();上述代碼中,getClass()方法是繼承自java.lang.Object
類的方法,所有的Java對(duì)象都可以調(diào)用該方法獲取當(dāng)前對(duì)象所屬類對(duì)應(yīng)的Class對(duì)象。11.2Class類(3)通過(guò)調(diào)用類的class屬性獲取類的Class對(duì)象ClassstuClass=Student.class;上述代碼中,通過(guò)Student類名直接調(diào)用其class屬性獲取了Student類對(duì)應(yīng)的Class對(duì)象。11.2Class類下面通過(guò)案例演示如何獲取類對(duì)應(yīng)的Class對(duì)象和Class對(duì)象的一些基本類信息。在com.itheima.example包下創(chuàng)建一個(gè)Animal接口、一個(gè)Cat類、一個(gè)Example01類。其中,Example01類繼承了Cat類并實(shí)現(xiàn)了Animal接口。案例演示Example01.java源代碼11.2Class類案例的運(yùn)行結(jié)果如下圖所示。案例演示反射的常見(jiàn)操作11.311.3反射的常見(jiàn)操作基于反射機(jī)制開(kāi)發(fā)人員可以在程序運(yùn)行時(shí)獲取和修改類的信息,包括構(gòu)造方法、成員變量、成員方法,以及它們的訪問(wèn)修飾符,下面對(duì)反射中對(duì)類的信息的常見(jiàn)操作進(jìn)行講解。11.3.1基于反射操作修飾符和構(gòu)造方法掌握基于反射操作修飾符和構(gòu)造方法,能夠通過(guò)Modifier類和Constructor類的常用方法操作修飾符和構(gòu)造方法
先定一個(gè)小目標(biāo)!11.3.1基于反射操作修飾符和構(gòu)造方法修飾符在運(yùn)行時(shí)會(huì)被轉(zhuǎn)換為對(duì)應(yīng)的整數(shù)常量,這些常量定義在java.lang.reflect.Modifier類中。Modifier類是java.lang.reflect中的一個(gè)工具類,它提供了一組靜態(tài)方法,用于處理Java代碼中的類、變量、方法等元素的訪問(wèn)修飾符,常見(jiàn)方法如下。方法描述isPublic(intmodifiers)用于檢查修飾符是否包含公共修飾符publicisProtected(intmodifiers)用于檢查修飾符是否包含受保護(hù)修飾符protectedisPrivate(intmodifiers)用于檢查修飾符是否包含私有修飾符privateisAbstract(intmodifiers)用于檢查修飾符是否包含抽象修飾符abstractisStatic(intmodifiers)用于檢查修飾符是否包含靜態(tài)修飾符statictoString(intmodifiers)用于將修飾符整數(shù)表示轉(zhuǎn)換為字符串表示11.3.1基于反射操作修飾符和構(gòu)造方法Java中的反射包java.lang.reflect中提供了用于反射的一組類,其中Constructor類用于描述類的構(gòu)造方法。Constructor類提供了一系列方法用來(lái)操作類的構(gòu)造方法。Constructor類的常用方法如下表所示。方法描述getName()用于獲取該構(gòu)造方法的名稱getModifiers()
用于獲取該構(gòu)造方法的修飾符getParameterCount()用于獲取該構(gòu)造方法的參數(shù)個(gè)數(shù)getParameterTypes()用于獲取表示構(gòu)造方法參數(shù)類型的Class
數(shù)組newInstance(Object...initargs)用于根據(jù)initargs參數(shù)列表對(duì)應(yīng)的構(gòu)造方法創(chuàng)建一個(gè)新的實(shí)例對(duì)象setAccessible(booleanflag)用于設(shè)置
Constructor對(duì)象的可訪問(wèn)標(biāo)志,設(shè)置可訪問(wèn)標(biāo)志為true時(shí)可以訪問(wèn)非公開(kāi)的構(gòu)造方法11.3.1基于反射操作修飾符和構(gòu)造方法需要注意的是,Constructor類的getModifiers()方法返回的是一個(gè)整數(shù),用于表示當(dāng)前構(gòu)造方法包含的所有修飾符。想要獲得該整數(shù)對(duì)應(yīng)的字符串形式的修飾符,可以通過(guò)Modifier類的toString()方法進(jìn)行轉(zhuǎn)換。11.3.1基于反射操作修飾符和構(gòu)造方法下面通過(guò)案例演示Constructor類常用方法的使用。案例演示Example02.java源代碼11.3.1基于反射操作修飾符和構(gòu)造方法案例的運(yùn)行結(jié)果如下圖所示。案例演示11.3.2基于反射操作修飾符和構(gòu)造方法掌握基于反射操作成員方法,能夠通過(guò)Method類的常用方法操作成員方法
先定一個(gè)小目標(biāo)!11.3.2基于反射操作修飾符和構(gòu)造方法Method類是java.lang.reflect包中的一個(gè)核心類,用于表示Java方法。通過(guò)Method對(duì)象可以獲取方法的名稱、參數(shù)類型、返回類型以及方法體等。該類常用方法如下表所示。方法描述getName()用于獲取方法的名稱getParameterTypes()用于獲取方法參數(shù)列表中的所有參數(shù)類型getReturnType()用于獲取方法的返回類型getModifiers()用于獲取方法的修飾符getDeclaringClass()用于獲取聲明該方法的類對(duì)象invoke(Objectobj,Object...args)用于在指定對(duì)象obj上執(zhí)行當(dāng)前方法,方法傳入的參數(shù)為argsgetExceptionTypes()用于獲取方法聲明的所有異常類型setAccessible(booleanflag)用于設(shè)置
Method對(duì)象的可訪問(wèn)標(biāo)志,為true時(shí)可以訪問(wèn)非公開(kāi)的方法11.3.2基于反射操作修飾符和構(gòu)造方法下面通過(guò)案例演示Method類常用方法的使用。案例演示Example03.java源代碼11.3.2基于反射操作修飾符和構(gòu)造方法案例的運(yùn)行結(jié)果如下圖所示。案例演示11.3.3基于反射操作成員變量掌握基于反射操作成員方法,能夠通過(guò)Method類的常用方法操作成員方法
先定一個(gè)小目標(biāo)!11.3.3基于反射操作成員變量Java的java.lang.reflect包中提供了Field類用于表示成員變量,該類中提供了一系列用于操作成員變量的方法,其中常用方法如下表所示。方法描述getName()用于獲取成員變量的名稱getType()用于獲取成員變量的類型getModifiers()用于獲取成員變量的修飾符getDeclaringClass()用于獲取成員變量所屬的類get(Objectobj)用于從對(duì)象obj中獲取成員變量的值set(Objectobj,Objectvalue)用于將對(duì)象obj中的成員變量的值設(shè)置為valuesetAccessible(booleanflag)用于設(shè)置
Field
對(duì)象的可訪問(wèn)標(biāo)志,設(shè)置為true時(shí)可以訪問(wèn)非公開(kāi)的屬性11.3.3基于反射操作成員變量案例演示Example04.java源代碼下面通過(guò)案例演示Field類常用方法的使用。11.3.3基于反射操作成員變量案例演示案例的運(yùn)行結(jié)果如下圖所示?!景咐?1-1】對(duì)象映射工具案例描述JSON是一種非常流行的數(shù)據(jù)交換方式。作為一種數(shù)據(jù)格式,JSON便于前后端的數(shù)據(jù)交互,并能夠提升網(wǎng)絡(luò)傳輸效率,廣泛運(yùn)用于Web應(yīng)用程序、移動(dòng)應(yīng)用程序和物聯(lián)網(wǎng)等多個(gè)領(lǐng)域。在JSON中,JSON數(shù)據(jù)以大括號(hào)({})表示對(duì)象的開(kāi)始和結(jié)束,數(shù)據(jù)以鍵值對(duì)的形式表示,鍵和值之間用冒號(hào)(:)分隔,不同的鍵值對(duì)之間用逗號(hào)(,)分隔,例如,{"id":1,"name":"祝融號(hào)"}。JSON數(shù)據(jù)和對(duì)象的轉(zhuǎn)換是數(shù)據(jù)交互、處理和存儲(chǔ)中非常常見(jiàn)的操作,它們使得數(shù)據(jù)的處理更加方便、統(tǒng)一和易于傳輸。為了方便JSON數(shù)據(jù)和對(duì)象之間的轉(zhuǎn)換,在此使用反射實(shí)現(xiàn)一個(gè)簡(jiǎn)單的對(duì)象映射
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鋼筋結(jié)構(gòu)施工協(xié)議
- 2025年智能交通系統(tǒng)建設(shè)反擔(dān)保合同3篇
- 2024年量子計(jì)算機(jī)技術(shù)研發(fā)與許可合同
- 2024年研發(fā)團(tuán)隊(duì)外包服務(wù)合同
- 專業(yè)化一體化服務(wù)合同范本(2024年版)版
- 2024校服生產(chǎn)與校園服裝租賃服務(wù)合同3篇
- 2024版混凝土框架結(jié)構(gòu)施工協(xié)議條款版B版
- 專業(yè)化人力資源解決方案服務(wù)協(xié)議樣本版A版
- 2025不動(dòng)產(chǎn)抵押權(quán)設(shè)立與登記服務(wù)擔(dān)保合同范本3篇
- 2024年茶園土地承包管理合同樣本
- 批量訂購(gòu)車(chē)輛合同范本
- 新能源發(fā)電技術(shù)學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- 初中物理-初三物理模擬試卷講評(píng)課教學(xué)課件設(shè)計(jì)
- 道路危險(xiǎn)貨物運(yùn)輸企業(yè)安全生產(chǎn)清單
- 鋼鐵生產(chǎn)企業(yè)溫室氣體核算與報(bào)告案例
- 農(nóng)業(yè)合作社全套報(bào)表(已設(shè)公式)-資產(chǎn)負(fù)債表-盈余及盈余分配表-成員權(quán)益變動(dòng)表-現(xiàn)金流量表
- 深入淺出Oracle EBS之OAF學(xué)習(xí)筆記-Oracle EBS技術(shù)文檔
- 貝利嬰幼兒發(fā)展量表BSID
- 四年級(jí)計(jì)算題大全(列豎式計(jì)算,可打印)
- 人教部編版八年級(jí)歷史下冊(cè)第7課 偉大的歷史轉(zhuǎn)折課件(共25張PPT)
- 年會(huì)主持詞:企業(yè)年會(huì)主持詞
評(píng)論
0/150
提交評(píng)論