JAVA動(dòng)態(tài)代理模式(從現(xiàn)實(shí)生活角度理解代碼原理)
所謂動(dòng)態(tài)代理,即通過(guò)代理類:Proxy的代理,接口和實(shí)現(xiàn)類之間可以不直接發(fā)生聯(lián)系,而可以在運(yùn)行期(Runtime)實(shí)現(xiàn)動(dòng)態(tài)關(guān)聯(lián)。
java動(dòng)態(tài)代理主要是使用java.lang.reflect包中的兩個(gè)類。
InvocationHandler類
public Object invoke(Object obj,Method method,Object[] obs)
其中第一個(gè)參數(shù) obj 指的是代理類,method是被代理的方法,obs是指被代理的方法的參數(shù)組。此方法由代理類來(lái)實(shí)現(xiàn)。
Proxy類
protectedProxy(InvocationHandler h); staticClass getProxyClass(ClassLoader loader,Class[] interfaces); staticObject newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandlerh);
動(dòng)態(tài)代理其實(shí)是在運(yùn)行時(shí)生成class,所以,我們必須提供一組interface,然后告訴他class已經(jīng)實(shí)現(xiàn)了這些interface,而且在生成Proxy的時(shí)候,必須給他提供一個(gè)handler,讓他來(lái)接管實(shí)際的工作。
同樣的在開始代碼實(shí)現(xiàn)之前,我們還是要講一下關(guān)于鏈家的故事,之前靜態(tài)代理模式中提到鏈家(接口)有賣二手房的業(yè)務(wù),公司有一大批售房精英(靜態(tài)代理),但現(xiàn)在互聯(lián)網(wǎng)金融這塊發(fā)展勢(shì)頭迅猛,鏈家也想插一腳進(jìn)去,但苦于沒(méi)有相關(guān)人才(代理)儲(chǔ)備,這時(shí)公司便有了從相關(guān)的人才市場(chǎng)(動(dòng)態(tài)代理“工廠”)尋找專業(yè)人才實(shí)現(xiàn)此類業(yè)務(wù)的想法,人才市場(chǎng),顧名思義,就是根據(jù)企業(yè)(接口)的某種需求(被代理的方法)尋找有相關(guān)技能的人才。下面開始動(dòng)態(tài)代理的實(shí)現(xiàn)代碼:
第一步:LianJia提供房屋買賣以及互聯(lián)網(wǎng)貸款渠道方法(接口)
interface LianJia {
public void sellHouse();
public void loan();
}
第二步:我們的房主不僅要賣房也要貸款做其他事情(市場(chǎng)需求)得知鏈家有這個(gè)業(yè)務(wù)所以他又找到了鏈家(被代理對(duì)象)
public class HouseMaster implements LianJia {
@Override
public void sellHouse() {
System.out.println("我有房子要賣");
}
@Override
public void loan() {
System.out.println("我要貸款做生意");
}
}
第三步:這里是浩瀚的人才市場(chǎng),你想要的這里都有(生成動(dòng)態(tài)代理的類)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreatProxy implements InvocationHandler{
//聲明被代理對(duì)象(之所以用Object是因?yàn)樗贘ava中是所有類包含自定義類的超類)
private Object target;
//創(chuàng)建代理對(duì)象(根據(jù)被代理對(duì)象需求)
public Object bind(Object target){
this.target = target;
//使用Proxy類創(chuàng)建一個(gè)動(dòng)態(tài)代理對(duì)象
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
return proxy;
}
//具體執(zhí)行業(yè)務(wù)的方法
/**
* proxy: 代理類對(duì)象
* method:被代理對(duì)象的方法
* args:被代理對(duì)象方法的參數(shù)
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//調(diào)用業(yè)務(wù)方法
method.invoke(target);
return null;
}
}
第四步:實(shí)現(xiàn)測(cè)試類
public class Test {
public static void main(String[] args) {
HouseMaster hm = new HouseMaster();
CreatProxy cp = new CreatProxy();
LianJia lj = (LianJia) cp.bind(hm);
lj.sellHouse();
lj.loan();
}
}
我們也發(fā)現(xiàn)從靜態(tài)代理到動(dòng)態(tài)代理整個(gè)過(guò)程中發(fā)現(xiàn),被代理對(duì)象(市場(chǎng)需求)會(huì)隨時(shí)變化,企業(yè)(接口)也必須啟用動(dòng)態(tài)代理模式才可應(yīng)對(duì)市場(chǎng)變化(個(gè)人認(rèn)為富士康就屬于一個(gè)大的電子類動(dòng)態(tài)代理工廠,而蘋果谷歌等企業(yè)則為市場(chǎng)需求的締造者與規(guī)則(接口)的)。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- Java簡(jiǎn)單實(shí)現(xiàn)動(dòng)態(tài)代理模式過(guò)程解析
- Java代理模式實(shí)例詳解【靜態(tài)代理與動(dòng)態(tài)代理】
- Java動(dòng)態(tài)代理模式的深入揭秘
- Java設(shè)計(jì)模式之動(dòng)態(tài)代理模式實(shí)例分析
- java 代理模式及動(dòng)態(tài)代理機(jī)制深入分析
- 詳解java動(dòng)態(tài)代理模式
- java代理模式與動(dòng)態(tài)代理模式詳解
- 代理模式之Java動(dòng)態(tài)代理實(shí)現(xiàn)方法
- Java代理模式與動(dòng)態(tài)代理之間的關(guān)系以及概念
相關(guān)文章
Java實(shí)現(xiàn)動(dòng)態(tài)IP代理的步驟詳解
在網(wǎng)絡(luò)編程中,動(dòng)態(tài)IP代理可以幫助用戶隱藏真實(shí)IP以及提高數(shù)據(jù)抓取的效率,本文將介紹如何在Java中實(shí)現(xiàn)動(dòng)態(tài)IP代理,包括設(shè)置代理、發(fā)送請(qǐng)求以及處理響應(yīng),需要的朋友可以參考下2025-02-02
深入分析RabbitMQ中死信隊(duì)列與死信交換機(jī)
這篇文章主要介紹了RabbitMQ中死信隊(duì)列與死信交換機(jī),死信隊(duì)列就是一個(gè)普通的交換機(jī),有些隊(duì)列的消息成為死信后,一般情況下會(huì)被RabbitMQ清理,感興趣想要詳細(xì)了解可以參考下文2023-05-05
IDEA編譯報(bào)錯(cuò):Error:(2048,1024) java: 找不到符號(hào)的解決方案
在使用 Lombok 的過(guò)程中,你是否曾遇到過(guò) IDEA 編譯報(bào)錯(cuò) Error:(2048,1024) java: 找不到符號(hào)?下面就讓我們來(lái)深入剖析這一問(wèn)題的根源,并給出相應(yīng)的解決方案,需要的朋友可以參考下2025-02-02
詳解SpringBoot中自定義starter的開發(fā)與使用
starter是SpringBoot中非常重要的一個(gè)機(jī)制,他是基于約定優(yōu)于配置的思想所衍生出來(lái)的,本文主要介紹了SpringBoot中自定義starter的開發(fā)與使用,感興趣的可以了解下2023-09-09
spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)

