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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java代理模式——静态代理动态代理

發布時間:2023/12/10 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java代理模式——静态代理动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

proxy mode

  • 1. 什么是代理
    • 1.1 例子解釋
    • 1.2 作用
  • 2. 靜態代理
    • 2.1 優缺點分析
    • 2.2 以廠家賣u盤用代碼說明
  • 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;// 功能 賣u盤 public interface UsbSell {// 賣usbfloat sell(int amount);}
  • 目標類 (a類)
package com.lovely.static_proxy;/*** 目標類 * @author echo lovely**/ public class Factory implements UsbSell {// 每個u盤賣10元@Overridepublic float sell(int amount) {System.out.println("工廠賣u盤");return 10.0f;}}
  • 淘寶代理類(代理b1)
package com.lovely.static_proxy;/*** 淘寶代理類 代理工廠 * @author echo lovely**/ public class TaoBao implements UsbSell {private Factory factory = new Factory();// 代理工廠@Overridepublic float sell(int amount) {// 多賣了 15.0f 功能增強1float price = factory.sell(amount) + 15.0f;// 功能增強2System.out.println("淘寶返回優惠券");return price;}}
  • 微商代理 (代理b2)
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;}}
  • 客戶端(a類)
package com.lovely.static_proxy;public class BuyMain {/*** 缺點 會創建許多代理對象* 如果 目標很多 代理對象很多* 目標增加 代理改變...* @param args*/public static void main(String[] args) {// 通過代理類 實現買you盤 增加了 買you盤 和 優惠券...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;// 實現賣u盤功能 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;/*** 代理類所實現的功能* @author echo lovely**/ public class MyInvocationHandler implements InvocationHandler {// 目標對象private Object target = null;public MyInvocationHandler(Object target) {this.target = target;}// 此方法 實現目標(賣u盤) 和 實現功能增強public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 調用目標對象target的 方法 Object returnValue = method.invoke(target, args);if (target != null) {float price = (float) returnValue;// 多賣20元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);// System.out.println(UsbKingFactory.class.getInterfaces()[0].getName());// System.out.println(UsbKingFactory.class.getClassLoader());// 創建代理對象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
cglib(code generating libray)動態代理: 第三方的工具庫 創建代理對象原理是繼承: cglib通過繼承目標類 創建子類 重寫方法 對功能修改對于無接口的類 使用cglib實現cglib在spring mybatis中使用較多

總結

以上是生活随笔為你收集整理的Java代理模式——静态代理动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

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