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