日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

动态代理3之代理工厂实现

發(fā)布時(shí)間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态代理3之代理工厂实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

動(dòng)態(tài)代理的深化:承接動(dòng)態(tài)代理2( 對(duì) 上級(jí)實(shí)例進(jìn)行 深化),也就是 spring 的前身

(必須掌握)實(shí)例:

文件說(shuō)明:1.有一個(gè)Waiter接口,該接口有一個(gè) server() 、ShouQian()方法

2.有一個(gè) Waiter接口的實(shí)現(xiàn)類(lèi),ManWaiter類(lèi)

3.一個(gè) 測(cè)試Test類(lèi)

???? 4. 后置增強(qiáng)接口: AfterAdvice 接口

???? 5.前置增強(qiáng)接口:BeforeAdvice接口

???? 6. 生成代理對(duì)象 的 ProxyFactory類(lèi)

1. Waiter.java 接口

// 服務(wù)員

public interface Waiter {

????// 服務(wù)

????public void serve();

????

????//收錢(qián)

????public void shouQian();

}

?

2. BeforeAdvice.java 接口,前置增強(qiáng)接口

/**

* 前置增強(qiáng)

* @author cxf

*

*/

public interface BeforeAdvice {

????public void before();

}

?

3. AfterAdvice.java 接口,后置增強(qiáng)接口

/**

* @function 后置增強(qiáng)

* @author not-bug

*

*/

public interface AfterAdvice {

????public void after();

}

?

4 . ManWaiter.java 類(lèi),該類(lèi)實(shí)現(xiàn)了 Waiter接口

//該類(lèi)實(shí)現(xiàn)了 Waiter 接口

public class ManWaiter implements Waiter {

????public void serve() {

????????System.out.println("服務(wù)中...");

????}

????

????public void shouQian() {

????????System.out.println("混蛋,給我錢(qián)!");

????}

}

?

5. ProxyFactory.java 類(lèi),用來(lái)生成代理對(duì)象的類(lèi)

/**

* 它用來(lái)生成代理對(duì)象

* 它需要所有的參數(shù)

* * 目標(biāo)對(duì)象

* * 增強(qiáng)

* @author cxf

*/

/**

* 1. 創(chuàng)建代理工廠

* 2. 給工廠設(shè)置三樣?xùn)|西:

* * 目標(biāo)對(duì)象:setTargetObject(xxx);

* * 前置增強(qiáng):setBeforeAdvice(該接口的實(shí)現(xiàn))

* * 后置增強(qiáng):setAfterAdvice(該接口的實(shí)現(xiàn))

* 3. 調(diào)用createProxy()得到代理對(duì)象

* * 執(zhí)行代理對(duì)象方法時(shí):

* > 執(zhí)行BeforeAdvicebefore()

* > 目標(biāo)對(duì)象的目標(biāo)方法

* > 執(zhí)行AfterAdviceafter()

* @author cxf

*

*/

public class ProxyFactory {

????private Object targetObject;//目標(biāo)對(duì)象

????private BeforeAdvice beforeAdvice;//前置增強(qiáng)

????private AfterAdvice afterAdvice;//后置增強(qiáng)

???? ?

????

????/**

???? * 用來(lái)生成代理對(duì)象

???? * @return

???? */

????public Object createProxy() {

????????/*

???????? * 1. 給出三大參數(shù)

???????? */

????????ClassLoader loader = this.getClass().getClassLoader();

????????Class[] interfaces = targetObject.getClass().getInterfaces();

????????InvocationHandler h = new InvocationHandler() {

????????????public Object invoke(Object proxy, Method method, Object[] args)

????????????????????throws Throwable {

????????????????/*

???????????????? * 在調(diào)用代理對(duì)象的方法時(shí)會(huì)執(zhí)行這里的內(nèi)容

???????????????? */

????????????????// 執(zhí)行前置增強(qiáng)

????????????????if(beforeAdvice != null) {

????????????????????beforeAdvice.before();

????????????????}

????????????????

????????????????Object result = method.invoke(targetObject, args);//執(zhí)行目標(biāo)對(duì)象的目標(biāo)方法

????????????????// 執(zhí)行后置增強(qiáng)

????????????????if(afterAdvice != null) {

????????????????????afterAdvice.after();

????????????????}

????????????????

????????????????// 返回目標(biāo)對(duì)象的返回值

????????????????return result;

????????????}

????????};

????????/*

???????? * 2. 得到代理對(duì)象

???????? */

????????Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

????????return proxyObject;

????}

???? ?

????

????public Object getTargetObject() {

????????return targetObject;

????}

????public void setTargetObject(Object targetObject) {

????????this.targetObject = targetObject;

????}

????public BeforeAdvice getBeforeAdvice() {

????????return beforeAdvice;

????}

????public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

????????this.beforeAdvice = beforeAdvice;

????}

????public AfterAdvice getAfterAdvice() {

????????return afterAdvice;

????}

????public void setAfterAdvice(AfterAdvice afterAdvice) {

????????this.afterAdvice = afterAdvice;

????}

}

?

6. Test.java ,測(cè)試類(lèi)

?

/*

* 目標(biāo)是讓目標(biāo)對(duì)象和增強(qiáng)都可以切換!

*/

public class Demo3 {

????@Test

????public void fun1() {

????????ProxyFactory factory = new ProxyFactory();//創(chuàng)建工廠

????????factory.setTargetObject(new ManWaiter());//設(shè)置目標(biāo)對(duì)象

????????factory.setBeforeAdvice(new BeforeAdvice() {//設(shè)置前置增強(qiáng)

????????????public void before() {

????????????????System.out.println("您好不好!");

????????????}

????????});

????????

????????factory.setAfterAdvice(new AfterAdvice() {//設(shè)置后置增強(qiáng)

????????????public void after() {

????????????????System.out.println("再見(jiàn)不見(jiàn)!");

????????????}

????????});

????????

????????Waiter waiter = (Waiter)factory.createProxy();

????????//waiter.shouQian();

????????waiter.serve();

????}

????

????//轉(zhuǎn)賬方法

????public void zhuanZhang() {

????????/*

???????? * 1.

???????? * 2.

???????? * 3.

???????? */

????}

}

?

運(yùn)行結(jié)果:

轉(zhuǎn)載于:https://www.cnblogs.com/Prozhu/p/5452962.html

總結(jié)

以上是生活随笔為你收集整理的动态代理3之代理工厂实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。