反射的基本實(shí)現(xiàn)

1.java里的class文件的加載

1、類型是編譯器已知的,這種.class文件在編譯的時(shí)候,編譯器會(huì)把.class文件打開檢查(ps:不是加載)

2、從別的地方獲取到了一個(gè)引用,然后動(dòng)態(tài)的把這個(gè)未知類型的引用的對(duì)象的.class文件加載進(jìn)jvm虛擬機(jī)里

java里的class文件的加載

RTTI(Run-Time Type Identification)運(yùn)行時(shí)類型識(shí)別

反射(reflection)

RTTI(Run-Time Type Identification)運(yùn)行時(shí)類型識(shí)別

如果不知道某個(gè)對(duì)象的確切類型,RTTI可以告訴你,但是有一個(gè)前提:這個(gè)類型在編譯時(shí)必須已知,這樣才能使用RTTI來識(shí)別它。

反射(reflection)

Class類與java.lang.reflect類庫(kù)一起對(duì)反射進(jìn)行了支持,該類庫(kù)包含F(xiàn)ield、Method和Constructor類,這些類的對(duì)象由JVM在啟動(dòng)時(shí)創(chuàng)建,用以表示未知類里對(duì)應(yīng)的成員。這樣的話就可以使用Contructor創(chuàng)建新的對(duì)象,用get()和set()方法獲取和修改類中與Field對(duì)象關(guān)聯(lián)的字段,用invoke()方法調(diào)用與Method對(duì)象關(guān)聯(lián)的方法。另外,還可以調(diào)用getFields()、getMethods()和getConstructors()等許多便利的方法,以返回表示字段、方法、以及構(gòu)造器對(duì)象的數(shù)組,這樣,對(duì)象信息可以在運(yùn)行時(shí)被完全確定下來,而在編譯時(shí)不需要知道關(guān)于類的任何事情。

2.知識(shí)剖析

反射

定義:能夠分析類能力的程序被稱為反射

反射庫(kù)(reflection library):提供了一個(gè)非常豐富且精心設(shè)計(jì)的工具集,以便編寫能夠動(dòng)態(tài)操縱Java代碼的程序

Class類

在程序運(yùn)行期間,Java運(yùn)行時(shí)系統(tǒng)始終為所有的對(duì)象維護(hù)一個(gè)被稱為運(yùn)行時(shí)的類型標(biāo)識(shí)。這個(gè)信息保存著每個(gè)對(duì)象所屬的類足跡。虛擬機(jī)利用運(yùn)行時(shí)信息選擇相應(yīng)的方法執(zhí)行。

Class類:專門用來保存上述信息的類,可以用來訪問這些信息。

Class 類的實(shí)例表示正在運(yùn)行的 Java 應(yīng)用程序中的類和接口。也就是jvm中有N多的實(shí)例每個(gè)類都有該Class對(duì)象。(包括基本數(shù)據(jù)類型)Class類沒有公共構(gòu)造方法。Class對(duì)象是在加載類時(shí)由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的defineClass方法自動(dòng)構(gòu)造的。也就是這不需要我們自己去處理創(chuàng)建,JVM已經(jīng)幫我們創(chuàng)建好了。

獲取Class對(duì)象的三種方式

Object ——> getClass();

任何數(shù)據(jù)類型(包括基本數(shù)據(jù)類型)都有一個(gè)“靜態(tài)”的class屬性

通過Class類的靜態(tài)方法:forName(String? className)(常用)

Class類獲取未知類里對(duì)應(yīng)的成員

.getFields() .getMethods() .getConstructors()

java.lang.reflect利用反射分析類的能力

Field:描述類的域

Method:描述類的方法

Constructor:描述類的構(gòu)造器

Method.invoke(Object, Object[])

調(diào)用對(duì)象所描述的方法,傳遞給定參數(shù),并返回方法的返回值

反射機(jī)制的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):運(yùn)行期類型的判斷,動(dòng)態(tài)類加載,動(dòng)態(tài)代理使用反射。

缺點(diǎn):性能是一個(gè)問題,反射相當(dāng)于一系列解釋操作,通知jvm要做的事情,性能比直接的java代碼要慢很多。

api:接口是應(yīng)用程序和模塊之間相互溝通的方式。提供某些功能的應(yīng)用程序或者模塊為了與其它程序相互溝通,對(duì)外公開了某些功能的調(diào)用方式方法,是應(yīng)用程序和模塊之間相互溝通的方式

3.編碼實(shí)戰(zhàn)

4.常見問題

1、private修飾?

.setAccessible(true);? 作用:在用反射時(shí)訪問私有變量

2、父類?

繼承Object類

3. 反射的作用?

調(diào)用一些私有方法,實(shí)現(xiàn)黑科技。比如雙卡短信發(fā)送、設(shè)置狀態(tài)欄顏色、自動(dòng)掛電話等

實(shí)現(xiàn)序列化與反序列化,比如PO的ORM,Json解析等

實(shí)現(xiàn)跨平臺(tái)兼容,比如JDK中的SocketImpl的實(shí)現(xiàn)

通過xml或注解,實(shí)現(xiàn)依賴注入(DI),注解處理,動(dòng)態(tài)代理,單元測(cè)試等功能。比如Retrofit、Spring或者Dagger

5.參考文獻(xiàn)

Field類的setAccessible()方法

Java基礎(chǔ)之—反射(非常重要)

Java核心技術(shù) 卷1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡(luò)上收集的一些資料的整理,因此不免有一些不準(zhǔn)確的地方,同時(shí)不同JDK版本的...
    高廣超閱讀 16,051評(píng)論 3 83
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,896評(píng)論 0 11
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • [內(nèi)感] 有一不為人知的感官稱為內(nèi)感:身體經(jīng)由內(nèi)在感受知曉感覺。它不是思考的結(jié)果,而是直覺的體驗(yàn)。它是內(nèi)在的感覺能...
    不要多愁善感閱讀 189評(píng)論 0 0
  • 小時(shí)愛為人師,或許父親是老師的緣故,我也把自己當(dāng)成一位小老師。我的這一愛好僅僅延續(xù)到小學(xué),到了初中物理奇差,歐姆雷...
    29c59f1aa9a3閱讀 256評(píng)論 0 0

友情鏈接更多精彩內(nèi)容