1. 程式人生 > >動態代理(CGLIB實現)

動態代理(CGLIB實現)

get 方式 rri reat call public 使用 odi pan

CGLIB(Code Generation Library)是一個開源項目。可以直接對類進行增強,而不需要像JDK的動態代理,需要增強的類必須實現某接口

在使用Spring框架時,因為Spring框架中core包中引入了cglib所以如果想通過cglib來實現動態代理,不需要專門的導cglib的jar包。

創建代理工廠時,必須得實現MethodInterceptor接口,因為通過cglib創建的代理對象在調方法時會默認執行intercept方法,通過該方法增加目標對象方法。

public class CglibProxyFactory implements MethodInterceptor {

//通過構造方法,把目標對象傳進來
private Object target;
public CglibProxyFactory(Object target) {
this.target = target;
}

//得到代理對象
public Object getProxyObject() {
Enhancer enhancer = new Enhancer(); //實例化cglib代理增強器-

enhancer.setSuperclass(target.getClass()); //設置目標的類:通過目標類對象來生成代理子對象

enhancer.setCallback(this); //回調方法 參數:回調的對象

return enhancer.create(); // 通過增強器得到代理對象
}

//增強目標對象方法
@Override
public Object intercept(
Object proxy, //代理對象
Method method, //目標對象的方法
Object[] args, //需要增強的方法的參數
MethodProxy proxyMethod //代理對象的方法繼承目標對象的方法(method)
) throws Throwable {

System.out.println("前置增強");

//直接調用目標對象的方法(目標方法執行方式1)
Object value = method.invoke(target, args);

//調用代理代理對象的父類方法,相當於間接調用目標對象的方法(目標方法執行方式2)
Object value = proxyMethod.invokeSuper(proxy, args);

System.out.println("後置增強");

return value;
}

}

動態代理(CGLIB實現)