上一篇關于java動態代理的jdk實現中,花了大量篇幅介紹了代理模式和靜態代理,最后講了jdk的動態代理實現,也講到了jdk動態代理實現的一些約束:只能基于接口實現代理
關于jdk的動態代理實現可以參考:
Java動態代理(jdk)
但是我們實際的編碼中,大量的類都沒有實現任何接口,如何對這些類進行代理呢?答案是cglib
- cglib簡介:
CGLIB(Code Generation Library)是一個開源項目! 是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java接口 CGLIB底層是基于asm框架去實現字節碼的生成
- cglib實現動態代理的步驟:
1、實現MethodInterceptor接口 2、通過Enhancer實現代理類的創建(生成一個繼承了客戶類的子類
- 范例代碼:
實現MethodInterceptor接口的類:
public class Hacker implements MethodInterceptor {
// 創建代理
public Object getProxy(RealSubject subject)
{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(subject.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("before the method is invoked");
// 這里調用的是invokeSuper而不是invoke
methodProxy.invokeSuper(o, objects);
System.out.println("after the method is invoked");
return null;
}
}
測試代碼:
public class TestMain {
public static void main(String[] args) {
RealSubject subject = new RealSubject();
Hacker hacker = new Hacker();
RealSubject proxy = (RealSubject) hacker.getProxy(subject);
proxy.play();
}
}
運行結果: