都知道Retrofit是通過(guò)動(dòng)態(tài)代理來(lái)生成代理對(duì)象作為網(wǎng)絡(luò)請(qǐng)求的發(fā)起者涮因。
今天就來(lái)看下動(dòng)態(tài)代理是怎么操作的拒迅×ち龋或者說(shuō)是怎么讓一個(gè)貌似接口的對(duì)象調(diào)用它的抽象方法呢?
先來(lái)看代碼:
public staticvoidmain(Stringargs) {Factoryfactory=newFactory; Bird bird = factory.create(Bird.class); bird.fly;//輸出結(jié)果為flying...}interfaceBird{ void fly;}
這里代碼通過(guò)一個(gè)Factory實(shí)例調(diào)用create方法既忆,傳入一個(gè)接口的class對(duì)象就可以返回一個(gè)接口的實(shí)例驱负,可以調(diào)用接口中的方法fly。
而在我們的靜態(tài)代碼中并沒(méi)有一個(gè)類去實(shí)現(xiàn)了這個(gè)Bird接口(完整代碼可以看下方)患雇。那么這個(gè)對(duì)象到底是從哪里來(lái)的呢跃脊?
完整代碼如下:
public class DynamicProxy{interfaceBird{ void fly; } public staticvoidmain(Stringargs) { Factory factory = new Factory; Bird bird =factory.create(Bird.class); bird.fly;//輸出結(jié)果為flying... } staticclassFactoryimplementsInvocationHandler{ public T create(Classtarget) { return(T) Proxy.newProxyInstance(target.getClassLoader, newClass{target},this); } publicObjectinvoke(Object
proxy, Method method,Objectargs)throws Throwable { System.out.println("flying..."); return null; }}}
在調(diào)用bird.fly時(shí),輸出結(jié)果為flying...苛吱,很明顯酪术,代碼中就如同開(kāi)始所說(shuō)的,并不存在一個(gè)實(shí)現(xiàn)了Bird接口的子類翠储,而bird又實(shí)實(shí)在在調(diào)用了fly方法绘雁。唯一的可能就是bird是接口的實(shí)例(或者說(shuō)實(shí)現(xiàn)接口的子類的對(duì)象)。這里看起來(lái)似乎就有些詭異了援所。
當(dāng)然編程沒(méi)有魔法庐舟,這里只是利用到了Java的動(dòng)態(tài)代理,通過(guò)Proxy.newProxyInstance方法生成實(shí)現(xiàn)了指定接口的子類住拭,然后返回了這個(gè)動(dòng)態(tài)生成類的實(shí)例對(duì)象挪略。
這個(gè)子類在調(diào)用接口中的方法時(shí),其實(shí)調(diào)用的是InvocationHandler的invoke方法废酷。在此方法中會(huì)有對(duì)應(yīng)參數(shù)的回調(diào)瘟檩,可以根據(jù)這些參數(shù)做出合適的攔截/增強(qiáng)等操作。
如果內(nèi)心還有編程的夢(mèng)想澈蟆,或者學(xué)習(xí)過(guò)程中遇到的困惑,想深入學(xué)習(xí)編程卓研,參加Java培訓(xùn)無(wú)疑是一個(gè)明智選擇趴俘,也是一條步入高薪行業(yè)的捷徑。
無(wú)論你是零基礎(chǔ)學(xué)Java奏赘,或者是已經(jīng)工作的技術(shù)人員想對(duì)自己進(jìn)行能力提升寥闪,都可以在中軟高科找到最合適的實(shí)訓(xùn)課程。
中軟高科Java實(shí)訓(xùn)全部選用真實(shí)商業(yè)項(xiàng)目銜接磨淌,讓學(xué)員參與商業(yè)項(xiàng)目等各種實(shí)踐性極強(qiáng)的課程疲憋,緊跟技術(shù)更新的步伐,滿足企業(yè)需求梁只,有效提高學(xué)員的IT技能和就業(yè)實(shí)力缚柳,實(shí)現(xiàn)和企業(yè)的對(duì)接埃脏,從根本問(wèn)題上解決了學(xué)員的就業(yè)問(wèn)題,讓學(xué)員成為各大企業(yè)的“搶手貨”秋忙。
現(xiàn)在進(jìn)入咨詢即有機(jī)會(huì)獲得免費(fèi)試聽(tīng)資格
報(bào)名地址:http://www.zparkedu.com/