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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态代理3之代理工厂实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態代理的深化:承接動態代理2( 對 上級實例進行 深化),也就是 spring 的前身

(必須掌握)實例:

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

2.有一個 Waiter接口的實現類,ManWaiter類

3.一個 測試Test類

???? 4. 后置增強接口: AfterAdvice 接口

???? 5.前置增強接口:BeforeAdvice接口

???? 6. 生成代理對象 的 ProxyFactory類

1. Waiter.java 接口

// 服務員

public interface Waiter {

????// 服務

????public void serve();

????

????//收錢

????public void shouQian();

}

?

2. BeforeAdvice.java 接口,前置增強接口

/**

* 前置增強

* @author cxf

*

*/

public interface BeforeAdvice {

????public void before();

}

?

3. AfterAdvice.java 接口,后置增強接口

/**

* @function 后置增強

* @author not-bug

*

*/

public interface AfterAdvice {

????public void after();

}

?

4 . ManWaiter.java 類,該類實現了 Waiter接口

//該類實現了 Waiter 接口

public class ManWaiter implements Waiter {

????public void serve() {

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

????}

????

????public void shouQian() {

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

????}

}

?

5. ProxyFactory.java 類,用來生成代理對象的類

/**

* 它用來生成代理對象

* 它需要所有的參數

* * 目標對象

* * 增強

* @author cxf

*/

/**

* 1. 創建代理工廠

* 2. 給工廠設置三樣東西:

* * 目標對象:setTargetObject(xxx);

* * 前置增強:setBeforeAdvice(該接口的實現)

* * 后置增強:setAfterAdvice(該接口的實現)

* 3. 調用createProxy()得到代理對象

* * 執行代理對象方法時:

* > 執行BeforeAdvicebefore()

* > 目標對象的目標方法

* > 執行AfterAdviceafter()

* @author cxf

*

*/

public class ProxyFactory {

????private Object targetObject;//目標對象

????private BeforeAdvice beforeAdvice;//前置增強

????private AfterAdvice afterAdvice;//后置增強

???? ?

????

????/**

???? * 用來生成代理對象

???? * @return

???? */

????public Object createProxy() {

????????/*

???????? * 1. 給出三大參數

???????? */

????????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 {

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

???????????????? * 在調用代理對象的方法時會執行這里的內容

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

????????????????// 執行前置增強

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

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

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

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

????????????????Object result = method.invoke(targetObject, args);//執行目標對象的目標方法

????????????????// 執行后置增強

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

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

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

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

????????????????// 返回目標對象的返回值

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

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

????????};

????????/*

???????? * 2. 得到代理對象

???????? */

????????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 ,測試類

?

/*

* 目標是讓目標對象和增強都可以切換!

*/

public class Demo3 {

????@Test

????public void fun1() {

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

????????factory.setTargetObject(new ManWaiter());//設置目標對象

????????factory.setBeforeAdvice(new BeforeAdvice() {//設置前置增強

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

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

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

????????});

????????

????????factory.setAfterAdvice(new AfterAdvice() {//設置后置增強

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

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

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

????????});

????????

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

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

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

????}

????

????//轉賬方法

????public void zhuanZhang() {

????????/*

???????? * 1.

???????? * 2.

???????? * 3.

???????? */

????}

}

?

運行結果:

轉載于:https://www.cnblogs.com/Prozhu/p/5452962.html

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。