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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java-动态代理

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

在學習spring的AOP時候,動態代理那是必不可少的環節。

今天簡單介紹一下動態代理。

java動態代理是一種設計模式中代理模式的一種,幫助我們開發的一個工具吧。

*1.動態代理的優勢:*

  • 降低各個功能模塊之間的耦合度,提高開發的效率和方便程序的維護度。

  • 和aop的思想和切合。

  • 減少代碼量。

  • 對靜態代理有個了解的讀者可能就知道,靜態代理的代碼量比較龐大,所以動態代理是靜態代理的升華。

    2.動態代理的實現方式
    jdk自帶的動態代理主要是通過實現InvocationHandler

    2.1 InvocationHandler的主要方法

    • Object invoke(Object proxy,
      Method method,
      Object[] args)
      throws Throwable

    • 在代理實例上處理方法調用并返回結果。在與方法關聯的代理實例上調用方法時,將在調用處理程序上調用此方法。

    2.2 方法詳細介紹

    • 參數:
      proxy - 調用方法的代理實例對象 method - 代理實例對象調用的接口方法的 Method 實例對象。
      Method-對象的聲明類將是在其中聲明方法的接口,該接口可以是代理類賴以繼承方法的代理接口的超接口。
      args -包含傳入代理實例上方法調用的參數值的對象數組,如果接口方法不使用參數,則為 null。

    • 返回:
      從代理實例的方法調用返回的值。

    • 拋出: Throwable - 從代理實例上的方法調用拋出的異常。

    3.具體登陸日志小案例(基于JDK動態代理)

    3.1 業務接口 Login

    public interface Login {public void login(String name); }

    3.2 業務實現類 LoginImpl

    public class LoginImpl implements Login{@Overridepublic void login(String name) {System.out.println("welcome "+name+", login success !!1");} }

    3.3 代理類 LoginProxy

    public class LoginProxy implements InvocationHandler {private Object target;public LoginProxy(Object target) {this.target = target;}public static Object init(Object Object){return Proxy.newProxyInstance(Object.getClass().getClassLoader(),Object.getClass().getInterfaces(),new LoginProxy(Object));}/*** 切入點 對所有對象的方法都進行調用* method.invoke方法對應代理對象調用login方法* @param proxy 代理對象* @param method 代理對象的方法* @param args 代理對象調用接口方法的參數值* @return 代理對象調用方法的返回值* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {login(method);Object invoke = method.invoke(target, args);loginout(method);return invoke;}//日志的方法public void log(String msg){System.out.println(msg);}//執行前日志public void login(Method method){log(method.getName()+"方法執行之前調用的信息");}//執行后日志public void loginout(Method method){log(method.getName()+"方法執行之后調用的信息");}}

    3.4 測試類 LoginClient

    public class LoginClient {public static void main(String[] args) {Login login = (Login) LoginProxy.init(new LoginImpl());login.login("zhangsan");} }

    3.5 執行結果:

    從上面的例子我們可以看到動態代理有效的減少了各個模塊的耦合度。
    用于實現日志功能的代碼和用于實現登陸功能的代碼相互隔離。
    只有在真正調用業務的時候并需要日志功能時候二者才發生聯系。
    任何業務需要日志功能只需要通過代理類創建代理對象即可。

    總結:
    代理對象機制是一種非常實用的設計模式,有利于程序的開發效率以及對于程序的后期維護。不必在關系各個模塊之間的相互制約關系。

    總結

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

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