生活随笔
收集整理的這篇文章主要介紹了
Java代理模式——静态代理动态代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
proxy mode
- 1. 什么是代理
- 2. 靜態代理
- 3. 動態代理
- 3.1 什么是動態代理
- 3.2 jdk實現原理
- 3.3 代碼描述
1. 什么是代理
1.1 例子解釋
1. 生活中的例子,常見的商家賣東西,
商家就是代理,工廠是目標,買東西的人是客戶端。
買東西不能找廠家買東西,工廠不賣,得找商家,
商家在其中形成了代理。
2. 房東--租房中介--租房人也是上面的關系
3. 程序中代理表示:a類訪問c類中的方法 但是c類不讓a類訪問 創建一個b代理 c讓b訪問
1.2 作用
1.功能增強 在原有的功能上 新增了額外的功能 , 新增的功能, 叫功能增強
2.控制訪問 代理類不讓你訪問目標 如商家不讓用戶訪問廠家
3.在項目中使用,使用別人的代碼,在不改變原來目標方法功能的前提下,
可以在代理中增強自己的功能代碼
2. 靜態代理
2.1 優缺點分析
代理類是自己手工實現的,自己創建一個Java類,表示代理類。你所代理的目標是確定的,好理解 缺點: 目標類增多 代理類可能成倍增加 數量太多...接口中 增加功能后 會影響代理類多實現功能...
2.2 以廠家賣u盤用代碼說明
package com
.lovely
.static_proxy
;
public interface UsbSell {float sell(int amount
);}
package com
.lovely
.static_proxy
;
public class Factory implements UsbSell {@Overridepublic float sell(int amount
) {System
.out
.println("工廠賣u盤");return 10.0f;}}
package com
.lovely
.static_proxy
;
public class TaoBao implements UsbSell {private Factory factory
= new Factory();@Overridepublic float sell(int amount
) {float price
= factory
.sell(amount
) + 15.0f;System
.out
.println("淘寶返回優惠券");return price
;}}
package com
.lovely
.static_proxy
;public class WeiSolder implements UsbSell {private Factory f
= new Factory();@Overridepublic float sell(int amount
) {return f
.sell(amount
) + 1.0f;}}
package com
.lovely
.static_proxy
;public class BuyMain {public static void main(String
[] args
) {TaoBao tb
= new TaoBao();float price
= tb
.sell(10);System
.out
.println("經過代理taobao 價格 " + price
);WeiSolder w
= new WeiSolder();price
= w
.sell(10);System
.out
.println("經過代理微商 價格 " + price
);}}
3. 動態代理
3.1 什么是動態代理
概念在程序執行過程中,使用jdk的反射機制,創建代理類對象(無需寫代理類了),并動態的指定要代理目標類(廠家)。又 : 動態代理是一種創建Java對象的能力,讓你不用創建代理類,就能創建代理類對象。代理目標是活動的,可設置的給不同的目標隨時創建代理
優點:解決靜態代理的弊端在靜態代理中目標類很多的時候 可使用動態代理 修改接口中的方法 不會影響代理類
3.2 jdk實現原理
要求:jdk的動態代理 目標類與代理類必須實現相同的接口,才可代理jdk動態代理實現:InvocationHandler: 只有一個invoke()方法,里面寫代理類實現的功能 1. 調用目標類方法 2. 實現功能增強public Object invoke(Object proxy, Method method, Object[] args)InvocationHandler 接口:表示你的代理要干什么。使用: 1. 創建類實現接口 InvocationHandler2. 重寫invoke方法,把原來靜態代理中代理類要完成的功能寫在invoke中Method 類 method.invoke(目標對象,"參數值")Proxy 類 使用proxy類的方法 表示創建對象 代替newProxy.newProxyInstance(more args...); 創建代理對象public static Object newProxyInstace(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)代理目標類, 創建代理類對象(返回值)參數1. ClassLoader loader 類加載器,負責向內存中加載對象。目標對象的類加載器。a.getClass().getClassLoader()2. Class<?>[] interfaces 目標對象實現的接口3. InvocationHandler 代理類要完成的功能
3.3 代碼描述
package com
.lovely
.dynamite_proxy
;
public interface UsbSell {public abstract float sell(int amount
);}
package com
.lovely
.dynamite_proxy
;public class UsbKingFactory implements UsbSell {@Overridepublic float sell(int amount
) {System
.out
.println("工廠實現賣u盤,每個" + 10.0f);return 10.0f;}}
package com
.lovely
.dynamite_proxy
;import java
.lang
.reflect
.InvocationHandler
;
import java
.lang
.reflect
.Method
;
public class MyInvocationHandler implements InvocationHandler {private Object target
= null
;public MyInvocationHandler(Object target
) {this.target
= target
;}public Object
invoke(Object proxy
, Method method
, Object
[] args
) throws Throwable
{Object returnValue
= method
.invoke(target
, args
);if (target
!= null
) {float price
= (float) returnValue
;price
+= 20.0f;returnValue
= price
;}System
.out
.println("這里調用目標方法,還可做其它操作,如寫一些其它功能");return returnValue
;}}
package com
.lovely
.dynamite_proxy
;import java
.lang
.reflect
.Proxy
;public class BuyMain {public static void main(String
[] args
) {UsbSell usbKing
= new UsbKingFactory();MyInvocationHandler handler
= new MyInvocationHandler(usbKing
);UsbSell proxy
= (UsbSell
)Proxy
.newProxyInstance(UsbKingFactory
.class.getClassLoader(), UsbKingFactory
.class.getInterfaces(), handler
);float price
= proxy
.sell(1);System
.out
.println("價格為 " + price
);}}
工廠實現賣u盤,每個
10.0
這里調用目標方法,還可做其它操作,如寫一些其它功能
價格為
30.0
cglib(code generating libray)動態代理: 第三方的工具庫 創建代理對象原理是繼承: cglib通過繼承目標類 創建子類 重寫方法 對功能修改對于無接口的類 使用cglib實現cglib在spring mybatis中使用較多
總結
以上是生活随笔為你收集整理的Java代理模式——静态代理动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。