Java代理模式之CGLIB動態代理

了解什么是動態代理模式,可參考Java設計模式之代理模式

簡介

前面我們了解了JDK動態代理技術,發現其真實對象必須提供接口才可以使用。在一些不提供接口的環境中,只能采用一些別的第三方技術,比如CGLIB動態代理。它的有事在于不需要提供接口,只要一個非抽象類就可以實現動態代理。

  • 實現代理邏輯的類需要實現net.sf.cglib.proxy.MethodInterceptor接口
  • 下面示例的具體代碼可到cglib動態代理中下載。
  • 實驗需要引入CGLIB jar包
   <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.2.2</version>
    </dependency>

示例

【真實對象類】

public class HelloGod {
    private String name;

    public HelloGod(String name){
        this.name = name;
    }

    public void helloGod(){
        System.out.println("hello " + name);
    }
}

【動態代理綁定和代理邏輯實現】

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibProxyExample implements MethodInterceptor {

    /**
     * @param cls Class類
     * @return Class的CGLIB代理對象
     */
    public Object getProxy(Class cls, Class[] argumentTypes, Object[] arguments){
        //CGLIB enhancer增強類對象
        Enhancer enhancer = new Enhancer();
        //設置增強類型
        enhancer.setSuperclass(cls);
        //定義代理對象為當前對象,要求當前對象實現MethodInterceptor方法
        enhancer.setCallback(this);
        //生成并返回代理對象
        return enhancer.create(argumentTypes ,arguments);
    }

    /**
     * @param proxy 代理對象
     * @param method 方法
     * @param args 方法參數
     * @param methodProxy 方法代理
     * @return 代理邏輯返回
     * @throws Throwable 拋出異常
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.err.println("調用真實對象前");

        //CGLIB反射調用真實對象方法
        Object result = methodProxy.invokeSuper(proxy, args);

        System.err.println("調用真實對象后");

        return result;
    }
}

【測試】

public class TestCglibProxy {

    public static void main(String[] args) {
        CglibProxyExample cglibProxyExample = new CglibProxyExample();
        Class[] argumentTypes = new Class[]{String.class};
        Object[] arguments = new Object[]{"baipengfei"};
        HelloGod helloGod = (HelloGod) cglibProxyExample.getProxy(HelloGod.class, argumentTypes ,arguments);
        helloGod.helloGod();
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 每個人的成長史都是一部血淚史。初出茅廬的職場新人總免不了被身邊的資深同事點評兩句,也經常被領導看不慣一些做法。 記...
    橙蜂破浪閱讀 521評論 0 0
  • 生活在一個信息爆炸的時代,如果沒有好好過濾和甄別信息,沒有收藏和整理的方法,會在信息洪流里越來越焦慮。 關注了許多...
    sally婧閱讀 246評論 2 0
  • 刷著朋友圈,穎子看到了一凡曬出的婚紗照,還有,購房合同。 穎子突然覺得很難受。 她點開一凡的微信。 “你還是在城市...
    曉宇姑娘閱讀 544評論 8 9
  • 很多年后偶遇暗戀的人會是什么樣的心情?我第一反應是假裝沒有認出來然后假裝鎮定卻手足無措。就在兩個小時前我遇到了六年...
    卡啦啦喲閱讀 392評論 0 0