java反射機(jī)制

在讀一些框架源碼,學(xué)習(xí)高手的編程邏輯之時(shí),常??床欢a,甚至?xí)岩勺约菏遣皇钦娴氖且粋€java程序員,為何別人寫得java代碼,幾乎不能看懂。

原因是在很多框架源碼中,有大量反射技術(shù)的運(yùn)用,對反射技術(shù)的不了解,造成閱讀源碼困難。可以說反射是框架的基石,因此下決心要先學(xué)會反射的基本原理,此文是我學(xué)習(xí)反射機(jī)制過程中,對反射原理的個人認(rèn)知的總結(jié)。

用官方的說法,反射(reflection)機(jī)制是指在程序的運(yùn)行狀態(tài)中,可以構(gòu)造任意一個類的對象,可以了解任意一個對象所屬的類,可以了解任意一個類的成員變量和方法,可以調(diào)用任意一個對象的屬性和方法。反射是動態(tài)語言的關(guān)鍵。

反射,是一個很抽象的概念,我覺得要想搞清楚反射,需要有兩個基礎(chǔ)。

一是對面向?qū)ο蟮牧私?。java被稱為是一種面向?qū)ο蟮木幊陶Z言。而編程語言是什么?編程語言可以說是一種告訴計(jì)算機(jī)如果操作數(shù)據(jù)的語言。這其中有兩個點(diǎn),一個是操作,一個是數(shù)據(jù),編程無非是告訴計(jì)算機(jī),對數(shù)據(jù)執(zhí)行哪些操作。比如說一個記錄網(wǎng)頁瀏覽人數(shù)的程序,有人打開網(wǎng)頁時(shí),告訴計(jì)算機(jī),把 瀏覽人數(shù) (數(shù)據(jù)),加上1(操作)。 而面向?qū)ο缶褪前巡僮骱蛿?shù)據(jù)封裝到一個個對象中,以此對程序代碼達(dá)到分門別類的作用,這就有點(diǎn)類似把一個大文件,拆分到多個文件夾中的情況。而類型,則是對對象的描述,可以說是對象的元數(shù)據(jù)。

二是java的運(yùn)行機(jī)制。java是通過一個叫JVM的程序,把類文件加載到內(nèi)存中,然后執(zhí)行其中的指令。JVM加載class文件過程,分為加載、鏈接、初始化三個步驟,把class的二進(jìn)制文件加載到內(nèi)存中,放入方法區(qū)中。與此同時(shí),生成一個Class類型的對象,這個Class類型,是描述類型的類型。打個比喻,比如說一個動物園,每一種動物有一個人類管理員,而動物園園長是所有人類管理員的管理員。對于java對象而言,它們是來自于我們定義的類型信息,類型是描述對象信息的元數(shù)據(jù),而Class類型也是一種類型,它把類型視作對象,它是描述類型的類型。我們定義一個類型(class)時(shí),會定義它的filed和method。而Class類型,即描述類的類型,它的屬性就是類的名稱,類的方法,它的方法就是獲取類的名稱,獲取類的方法,獲取類的構(gòu)造器等等等

比如我們定義了一個Dog類型,它有一個dogName屬性,描述的是這只狗狗的名字,他有一個bark()方法,描述的是狗吠的行為。通過這個類型,我們可以實(shí)例化一個狗對象,這個狗對象的名字叫大白,它叫的行為是每隔5分鐘叫一次。我們可以用一個對象來描述狗這個類型,這個類型的名字是狗,這個類型的屬性有dogName,這個類型的方法有bark(),這個類型的構(gòu)造器有默認(rèn)的,這個類型的訪問修飾符是public的,這個類型的父類是Object。等等等等。這個類型就是狗的類對象,它描述了狗這個類型的信息,它是Class類的實(shí)例對象。

JVM運(yùn)行時(shí),加載每一個類到內(nèi)存之后,都會為它創(chuàng)建一個類對象,即Class類型的對象,用來描述這個類的信息。而后通過這個類創(chuàng)建的對象,則被稱為這個類的實(shí)例對象。所以,搞清楚,一個類,在jvm可以存在兩種類型,一種是類對象,一種是實(shí)例對象。類對象描述類型的信息,實(shí)例對象是根據(jù)類型信息創(chuàng)建出來的對象。

反射的核心,就是類的類對象。通過獲取類的類對象,可以得到這個類的所有信息,通過類對象,就可以創(chuàng)建類的實(shí)例對象。

我們說通過類的類對象創(chuàng)建類的實(shí)例對象,提供了一種動態(tài)創(chuàng)建對象的方式。關(guān)于這樣動態(tài)創(chuàng)建對象有什么好處,以后抽空再聊

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

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

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