JDK的動態代理與cglib動態代理


JDK的動態代理與cglib動態代理

兩種代理模式:

  • 動態代理:代理類不存在,在程序運行過程中,動態生成代理類和代理類對象,再通過代理對象調用目標對象
  • 靜態代理(裝飾者模式):代理類是提前創建好的,直接創建代理類對象,再通過代理對象調用目標對象

一、JDK動態代理

jdk的動態代理是基於接口的動態代理,要求目標對象必須實現至少一個接口,核心API是java.lang.reflect.Proxy類的newProxyInstance方法。

Object proxy = Proxy.newProxyInstance(
					ClassLoader loader,
    				Class[] interfaces,
					InvocationHandler handler
				);

返回值:接口的實現類對象

參數:

  • loader:類加載器對象

  • interfaces:代理對象要實現的接口字節碼對象數組,通常寫成目標對象.getClass().getInterfaces()

  • handler:代理類的方法里,要執行的操作

    • 通常是增強目標對象的方法或控制目標對象的方法

    • 是InvocationHandler接口的實現類,通常寫成匿名內部類形式

      new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              //proxy:代理對象的引用,通常不用
              //method:調用的方法對象
              //args:調用的方法的參數
              //result:調用代理對象時的返回值
              return result;
            }
      }
      

二、cglib動態代理

cglib的動態代理是基於子類的動態代理,不需要目標對象實現接口,要求被代理類不能由final修飾.核心API是cglib.proxy.Enhancer類的create方法

Enhancer.create(目標對象.getClass(), new MethodInterceptor() {
            /**
             * @param proxy:代理對象引用
             * @param method:目標對象方法(通過它可以訪問目標對象)
             * @param args:傳遞給目標對象的參數
             * @MethodProxy methodProxy:代理對象的方法
             * @return 返回值
             * @throws Throwable
             */
   public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //功能代碼
                return result;
            }
        });

返回值:目標類的子類對象

參數:

  • Class:被代理對象的字節碼對象,可以創建被代理對象的子類,還可以獲取被代理對象的類加載器
  • Callback:增強的代碼,通常都是些一個接口的實現類或匿名內部類,我們在使用時一般都是使用Callback接口的子接口:MethodInterceptor


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM