程序運(yùn)行時(shí)類創(chuàng)建的代理方法稱為動(dòng)態(tài)代理。也就是說,在這種情況下,代理類不是在Java代碼中定義的,而是在運(yùn)行時(shí)根據(jù)我們在Java代碼中的指令動(dòng)態(tài)生成的。與靜態(tài)代理相比,動(dòng)態(tài)代理的優(yōu)勢在于可以方便地統(tǒng)一處理代理類的功能,而無需修改每個(gè)代理類的功能。
那么如何使用動(dòng)態(tài)代理IP呢?首先,我們需要在代理類和委托類之間定義一個(gè)中介類。實(shí)現(xiàn)InvocationHandler接口需要這個(gè)中介類。從名稱InvocationHandler中,我們可以知道實(shí)現(xiàn)這個(gè)接口的中介類被用作“調(diào)用處理器”。
當(dāng)我們調(diào)用代理類對(duì)象的方法時(shí),這個(gè)“調(diào)用”將被轉(zhuǎn)移到invoke方法。代理類對(duì)象作為代理參數(shù)傳入。參數(shù)方法標(biāo)識(shí)我們具體調(diào)用代理類的哪個(gè)方法,args是這個(gè)方法的參數(shù)。這樣,我們對(duì)代理類中所有方法的調(diào)用都會(huì)變成對(duì)invoke的調(diào)用,這樣我們就可以給invoke方法添加統(tǒng)一的處理邏輯(或者根據(jù)方法參數(shù)對(duì)不同的代理類方法做不同的處理)。因此,我們只需要在中介類的invoke方法實(shí)現(xiàn)中輸出“before”,然后調(diào)用委托類的invoke方法,再輸出“after”。在動(dòng)態(tài)代理模式下,要求委托類必須實(shí)現(xiàn)一個(gè)接口,這里我們實(shí)現(xiàn)了Sell接口。如上所述,中介類必須實(shí)現(xiàn)InvocationHandler接口作為調(diào)用處理器來“攔截”對(duì)代理類方法的調(diào)用。
簡單總結(jié)一下:首先我們通過newProxyInstance方法獲取代理類實(shí)例,然后我們可以通過這個(gè)代理類實(shí)例調(diào)用代理類方法。事實(shí)上,對(duì)代理類方法的調(diào)用將調(diào)用中間類(調(diào)用處理器)的invoke方法。在invoke方法中,我們調(diào)用委托類的相應(yīng)方法,并添加我們自己的處理邏輯。