本篇為Android架構(gòu)師java原理專題二;反射原理及動態(tài)代理模式。
大公司面試都要求我們有扎實的Java語言基礎(chǔ)。而很多Android開發(fā)朋友這一塊并不是很熟練,甚至半路初級底子很薄,這給我們進(jìn)階造成了很大的困擾,很容易就碰到瓶頸。如果我們想提升成為高級工程師甚至架構(gòu)師,java基礎(chǔ)一定要學(xué)好。
反射之中包含了一個「反」字,所以了解反射我們先從「正」開始。
一般情況下,我們使用某個類時必定知道它是什么類,是用來做什么的。于是我們直接對這個類進(jìn)行實例化,之后使用這個類對象進(jìn)行操作。
反射則是一開始并不知道我要初始化的類對象是什么,自然也無法使用 new 關(guān)鍵字來創(chuàng)建對象了。這時候,我們使用 JDK 提供的反射 API 進(jìn)行反射調(diào)用。反射就是在運行時才知道要操作的類是什么,并且可以在運行時獲取類的完整構(gòu)造,并調(diào)用對應(yīng)的方法。
Reflection(反射)是Java被視為動態(tài)語言的關(guān)鍵,反射機制允許程序在執(zhí)行期借助于Reflection API取得任何類的內(nèi)部信息,并能直接操作任意對象的內(nèi)部屬性及方法。
Java反射機制主要提供了以下功能:
在運行時構(gòu)造任意一個類的對象
在運行時獲取任意一個類所具有的成員變量和方法
在運行時調(diào)用任意一個對象的方法(屬性)
Java 是一門面向?qū)ο蟮恼Z言。在面向?qū)ο蟮氖澜缋?,萬事萬物皆對象,既然萬事萬物皆對象,那么我們的類是不是對象呢?
我們寫的每一個類都可以看成一個對象,是 java.lang.Class 類的對象。每一個類對應(yīng)的Class放在哪里呢?當(dāng)我們寫完一個類的Java文件,編譯成class文件的時候,編譯器都會將這個類的對應(yīng)的class對象放在class文件的末尾。
里面都保存了些什么?大家可以理解保存了類的元數(shù)據(jù)信息,一個類的元數(shù)據(jù)信息包括什么?有哪些屬性,方法,構(gòu)造器,實現(xiàn)了哪些接口等等,那么這些信息在Java里都有對應(yīng)的類來表示。
Class類
Class是一個類,封裝了當(dāng)前對象所對應(yīng)的類的信息
一個類中有屬性,方法,構(gòu)造器等,比如說有一個Person類,一個Order類,一個Book類,這些都是不同的類,現(xiàn)在需要一個類,用來描述類,這就是Class,它應(yīng)該有類名,屬性,方法,構(gòu)造器等。Class是用來描述類的類。
Class類是一個對象照鏡子的結(jié)果,對象可以看到自己有哪些屬性,方法,構(gòu)造器,實現(xiàn)了哪些接口等等
對于每個類而言,JRE 都為其保留一個不變的 Class 類型的對象。一個 Class 對象包含了特定某個類的有關(guān)信息。
對象只能由系統(tǒng)建立對象,一個類(而不是一個對象)在 JVM 中只會有一個Class實例
獲取Class對象的三種方式;
1.通過類名獲取 類名.class
2.通過對象獲取 對象名.getClass()
3.通過全類名獲取 Class.forName(全類名)
代理模式和靜態(tài)代理
代理模式給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。通俗的來講代理模式就是我們生活中常見的中介。
舉個例子來說明:張三想買某種用品,雖然他可以自己去找,但是這確實太浪費時間和精力了,或者不好意思去買。于是張三就通過中介Mark來買,Mark來幫張三,張三只是負(fù)責(zé)選擇自己喜歡的的size,然后付錢就可以了。
目的:
(1)通過引入代理對象的方式來間接訪問目標(biāo)對象,防止直接訪問目標(biāo)對象給系統(tǒng)帶來的不必要復(fù)雜性
(2)通過代理對象對原有的業(yè)務(wù)增強;
代理模式一般會有三個角色:
抽象角色:指代理角色和真實角色對外提供的公共方法,一般為一個接口
真實角色:需要實現(xiàn)抽象角色接口,定義了真實角色所要實現(xiàn)的業(yè)務(wù)邏輯,以便供代理角色調(diào)用。也就是真正的業(yè)務(wù)邏輯在此。
代理角色:需要實現(xiàn)抽象角色接口,是真實角色的代理,通過真實角色的業(yè)務(wù)邏輯方法來實現(xiàn)抽象方法,并可以附加自己的操作。將統(tǒng)一的流程控制都放到代理角色中處理!
而訪問者不再訪問真實角色,而是去訪問代理角色。
靜態(tài)代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實現(xiàn)相同的接口或者是繼承相同父類。一般來說,被代理對象和代理對象是一對一的關(guān)系,當(dāng)然一個代理對象對應(yīng)多個被代理對象也是可以的。
靜態(tài)代理,一對一則會出現(xiàn)時靜態(tài)代理對象量多、代碼量大,從而導(dǎo)致代碼復(fù)雜,可維護(hù)性差的問題,一對多則代理對象會出現(xiàn)擴展能力差的問題。
是指在使用時再創(chuàng)建代理類和實例
優(yōu)點
只需要1個動態(tài)代理類就可以解決創(chuàng)建多個靜態(tài)代理的問題,避免重復(fù)、多余代碼
更強的靈活性
缺點
效率低,相比靜態(tài)代理中 直接調(diào)用目標(biāo)對象方法,動態(tài)代理則需要先通過Java反射機制 從而 間接調(diào)用目標(biāo)對象方法
應(yīng)用場景局限,因為 Java 的單繼承特性(每個代理類都繼承了 Proxy 類),即只能針對接口 創(chuàng)建 代理類,不能針對類創(chuàng)建代理類。
在java的動態(tài)代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口、另一個則是 Proxy類,這個類和接口是實現(xiàn)我們動態(tài)代理所必須用到的。
InvocationHandler接口是給動態(tài)代理類實現(xiàn)的,負(fù)責(zé)處理被代理對象的操作的,而Proxy是用來創(chuàng)建動態(tài)代理類實例對象的,因為只有得到了這個對象我們才能調(diào)用那些需要代理的方法。
以上為概念介紹,建議理解概念后再去學(xué)習(xí)動態(tài)代理實現(xiàn)原理,原理詳解視頻也可以分享給大家,有興趣的朋友記得把自己去理解其中原理,并且手寫一下源碼,依靠復(fù)制粘貼是永遠(yuǎn)不會有大的成長的
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文標(biāo)題:【Android架構(gòu)師java原理專題詳解】二;反射原理及動態(tài)代理模式-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://chinadenli.net/article10/idjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、建站公司、網(wǎng)站設(shè)計、網(wǎng)站營銷、搜索引擎優(yōu)化、網(wǎng)頁設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容