1. 程式人生 > >【代理模式】jdk和cglib動態代理實現的區別

【代理模式】jdk和cglib動態代理實現的區別

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、通過反射機制獲取例項構造,並初始化代理類物件。