一、java動態代理
- 實現InvocationHandler接口,來創建自己的調用處理器;
- 爲Proxy指定ClassLoader對象和一組interface來創建動態代理;
- 通過反射獲得動態代理的構造函數,唯一參數類型爲是調用處理器的接口類型;
- 構造函數創建代理類實例,構造時調用處理器對象作爲參數被傳入;
實例:
public class ProxyTest {
public static void main(String[] args) {
final X o = (X) Proxy.newProxyInstance(X.class.getClassLoader(), new Class[]{X.class}, new XIH<X>(new XImpl()));
o.a();
o.b();
}
static class XIH<T> implements InvocationHandler {
private T t;
XIH(T t) {
this.t = t;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("通知開始!");
final Object o = method.invoke(this.t, args);
System.out.println("通知結束!");
return o;
}
}
}
public interface X {
void a();
void b();
}
二、cglib
- 運行期間擴展Java類和實現java接口;
- 高性能、高質量的java生成類庫;
- cglib封裝asm,可以運行期間動態生成java類;
- cglib用於AOP,java的Proxy必須基於接口,cglib沒有限制;
三、區別
java動態代理是利用反射機制生成一個利用代理接口的匿名類,在調用具體方法前調用InvocationHandler來處理;
cglib動態代理是使用asm開源包,加載代理對象類的class文件,修改其字節碼生成子類進行處理;