【代理模式】jdk和cglib動態代理實現的區別
阿新 • • 發佈:2018-12-20
jdk和cglib動態代理實現的區別
1、jdk動態代理生成的代理類和委託類實現了相同的介面; 2、cglib動態代理中生成的位元組碼更加複雜,生成的代理類是委託類的子類,且不能處理被final關鍵字修飾的方法; 3、jdk採用反射機制呼叫委託類的方法,cglib採用類似索引的方式直接呼叫委託類方法;
cglib實現
使用cglib[Code Generation Library]實現動態代理,並不要求委託類必須實現介面,底層採用asm位元組碼生成框架生成代理類的位元組碼,下面通過一個例子看看使用CGLib如何實現動態代理。 1、定義業務邏輯
public class UserServiceImpl { public void add() { System.out.println("This is add service"); } public void delete(int id) { System.out.println("This is delete service:delete " + id ); } }
2、實現MethodInterceptor
介面,定義方法的攔截器
public class MyMethodInterceptor implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] arg, MethodProxy proxy) throws Throwable { System.out.println("Before:" + method); Object object = proxy.invokeSuper(obj, arg); System.out.println("After:" + method); return object; } }
3、利用Enhancer
類生成代理類;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback(new MyMethodInterceptor());
UserServiceImpl userService = (UserServiceImpl)enhancer.create();
4、userService.add()
的執行結果:
Before: add
This is add service
After: add
代理物件的生成過程由 Enhancer類實現,大概步驟如下:
1、生成代理類Class的二進位制位元組碼;
2、通過Class.forName
載入二進位制位元組碼,生成Class物件;
3、通過反射機制獲取例項構造,並初始化代理類物件。