更新時(shí)間:2020-04-14 11:59:28 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2784次
首先我們先聲明一個(gè)class,內(nèi)部包含了另一個(gè)對(duì)象,并且寫了一些私有/公有/靜態(tài)的變量及方法,一會(huì)將針對(duì)這個(gè)class進(jìn)行反射的操作:
這里的日志使用了Log是Android里的打印輸出,而非Java中的System.out.print。

內(nèi)部的ReflectBean類

獲取擁有真正對(duì)象代碼結(jié)構(gòu)的Class:
不知道各位小伙伴們有沒有思考過,為什么我們new一個(gè)類的時(shí)候這么方便,反而到了反射的時(shí)候會(huì)如此的麻煩?

將Class實(shí)例化

反射調(diào)用方法

反射調(diào)用變量/static

繼續(xù)理解
我們知道JVM在使用一個(gè)類的時(shí)候,會(huì)先去加載這個(gè)類。也就是生成唯一的Class對(duì)象。這個(gè)Class對(duì)象擁有我們的java代碼的變量,方法結(jié)構(gòu)。但是它并不是一個(gè)實(shí)例。因此我們?cè)诜瓷涞臅r(shí)候,要先獲取構(gòu)造方法對(duì)象,也就是Class返回給我們的Constructor。此時(shí)我們運(yùn)行這個(gè)對(duì)象的newInstance,我們就初始化了這個(gè)Class,獲取了這個(gè)Class的實(shí)例。(這也就是為什么我們反射操作會(huì)如此的麻煩)
實(shí)例化了這個(gè)對(duì)象之后,雖然只是一個(gè)Object對(duì)象,但是它和我們真正new的對(duì)象沒有任何區(qū)別,那么此時(shí)我們就可以正常的調(diào)用方法了。
我們知道,static是屬于類,在類被加載的時(shí)候就已經(jīng)出現(xiàn)了。那么此時(shí),反射也側(cè)面證實(shí)了這個(gè)問題:
在我們反射調(diào)用static的變量和方法時(shí),set或者invoke的參數(shù)傳的是null,也就是說我們沒有傳遞任何對(duì)象實(shí)例,所以此時(shí)我們使用的是這個(gè)在類被加載時(shí)就被創(chuàng)建的Class對(duì)象中的變量和方法,而非操作的實(shí)例對(duì)象。因此,對(duì)static是不是有了一個(gè)更為深刻的理解呢?
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java基礎(chǔ)學(xué)習(xí):java反射視頻”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)