更新時間:2020-04-14 11:59:28 來源:動力節點 瀏覽2393次
首先我們先聲明一個class,內部包含了另一個對象,并且寫了一些私有/公有/靜態的變量及方法,一會將針對這個class進行反射的操作:
這里的日志使用了Log是Android里的打印輸出,而非Java中的System.out.print。
內部的ReflectBean類
獲取擁有真正對象代碼結構的Class:
不知道各位小伙伴們有沒有思考過,為什么我們new一個類的時候這么方便,反而到了反射的時候會如此的麻煩?
將Class實例化
反射調用方法
反射調用變量/static
繼續理解
我們知道JVM在使用一個類的時候,會先去加載這個類。也就是生成唯一的Class對象。這個Class對象擁有我們的java代碼的變量,方法結構。但是它并不是一個實例。因此我們在反射的時候,要先獲取構造方法對象,也就是Class返回給我們的Constructor。此時我們運行這個對象的newInstance,我們就初始化了這個Class,獲取了這個Class的實例。(這也就是為什么我們反射操作會如此的麻煩)
實例化了這個對象之后,雖然只是一個Object對象,但是它和我們真正new的對象沒有任何區別,那么此時我們就可以正常的調用方法了。
我們知道,static是屬于類,在類被加載的時候就已經出現了。那么此時,反射也側面證實了這個問題:
在我們反射調用static的變量和方法時,set或者invoke的參數傳的是null,也就是說我們沒有傳遞任何對象實例,所以此時我們使用的是這個在類被加載時就被創建的Class對象中的變量和方法,而非操作的實例對象。因此,對static是不是有了一個更為深刻的理解呢?
以上就是動力節點java培訓機構的小編針對“Java基礎學習:java反射視頻”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習