代理模式--CGLIB動態代理(內含詳細實現步驟及代碼)

實現步驟:

1.創建被代理的類及方法。

public class Train {

    public void move() {
        System.out.println("火車行駛中");
    }

}

2.創建一個實現接口MethodInterceptor的類,重寫intercept方法,創建獲取被代理類的方法 getProxy(Class cla);

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CglibProxy implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();

    // 創建獲取被代理類的方法
    public Object getProxy(Class cla) {
        // 設置創建子類的類(爲那個類產生代理類)
        enhancer.setSuperclass(cla);
        enhancer.setCallback(this);

        // 創建並返回類的實例
        return enhancer.create();

    }

    /*攔截所有目標類方法的調用 obj 目標方法的實例對象 m 目標方法的反射對象 args 方法的參數 proxy 代理類的實例


    @Override
    public Object intercept(Object obj, Method m, Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("日誌開始...");
        // 代理類調用父類的方法
        proxy.invokeSuper(obj, args);
        System.out.println("日誌結束...");
        return null;
    }

}

3.獲取代理類,通過代理調用方法

public class Test {

    public static void main(String[] args) {
        CglibProxy proxy = new CglibProxy();
        //返回代理類的對象
        Train t  =  (Train)proxy.getProxy(Train.class);
        t.move();
    }

}

控制檯輸出:
日誌開始…
火車行駛中
日誌結束…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章