更新時間:2020-04-14 11:59:28 來源:動力節(jié)點 瀏覽2382次
首先我們先聲明一個class,內(nèi)部包含了另一個對象,并且寫了一些私有/公有/靜態(tài)的變量及方法,一會將針對這個class進行反射的操作:
這里的日志使用了Log是Android里的打印輸出,而非Java中的System.out.print。
內(nèi)部的ReflectBean類
獲取擁有真正對象代碼結(jié)構(gòu)的Class:
不知道各位小伙伴們有沒有思考過,為什么我們new一個類的時候這么方便,反而到了反射的時候會如此的麻煩?
將Class實例化
反射調(diào)用方法
反射調(diào)用變量/static
繼續(xù)理解
我們知道JVM在使用一個類的時候,會先去加載這個類。也就是生成唯一的Class對象。這個Class對象擁有我們的java代碼的變量,方法結(jié)構(gòu)。但是它并不是一個實例。因此我們在反射的時候,要先獲取構(gòu)造方法對象,也就是Class返回給我們的Constructor。此時我們運行這個對象的newInstance,我們就初始化了這個Class,獲取了這個Class的實例。(這也就是為什么我們反射操作會如此的麻煩)
實例化了這個對象之后,雖然只是一個Object對象,但是它和我們真正new的對象沒有任何區(qū)別,那么此時我們就可以正常的調(diào)用方法了。
我們知道,static是屬于類,在類被加載的時候就已經(jīng)出現(xiàn)了。那么此時,反射也側(cè)面證實了這個問題:
在我們反射調(diào)用static的變量和方法時,set或者invoke的參數(shù)傳的是null,也就是說我們沒有傳遞任何對象實例,所以此時我們使用的是這個在類被加載時就被創(chuàng)建的Class對象中的變量和方法,而非操作的實例對象。因此,對static是不是有了一個更為深刻的理解呢?
以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“Java基礎(chǔ)學(xué)習(xí):java反射視頻”的內(nèi)容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743