官术网_书友最值得收藏!

3.2.2 CGLIB動態代理

CGLIB是一個Java字節碼生成庫,提供了易用的API對Java字節碼進行創建和修改。我們現在嘗試用CGLIB來代理前面的RealAccount類,如代碼清單3-9所示。

代碼清單3-9 AccountCglibProxy類代碼

public class AccountCglibProxy implements MethodInterceptor {
    private Enhancer enhancer = new Enhancer();

    public Object getProxy(Class<?> clazz) {
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("before");
        Object object = proxy.invokeSuper(obj, args);
        System.out.println("after");
        return object;
    }
}

上述代碼中的Enhancer類是CGLIB中最常用的一個類,類似于前面介紹的JDK動態代理中的Proxy類。和Proxy只能代理接口不同,Enhancer既能夠代理接口,也能夠代理普通類,但不能攔截final類和方法。在這里,我們實現了MethodInterceptor中的intercept()方法以提供代理邏輯。

AccountCglibProxy類的使用方法也比較簡單,如代碼清單3-10所示。

代碼清單3-10 AccountCglibProxy類使用方法代碼

AccountCglibProxy proxy = new AccountCglibProxy();
RealAccount account = (RealAccount) proxy.getProxy(RealAccount.class);
account.open();

作為對比,我們用表3-1展示了JDK動態代理和CGLIB動態代理之間的區別。

表3-1 JDK動態代理和CGLIB動態代理對比

067-1
主站蜘蛛池模板: 辽宁省| 乐清市| 平陆县| 原阳县| 东兴市| 曲麻莱县| 新宾| 仁寿县| 冷水江市| 平原县| 桦南县| 通许县| 浦城县| 云安县| 平邑县| 梓潼县| 景德镇市| 新和县| 桐城市| 漾濞| 旅游| 通化市| 临海市| 将乐县| 和顺县| 丰顺县| 九江市| 工布江达县| 绥棱县| 桑植县| 佛坪县| 都匀市| 刚察县| 乌审旗| 达日县| 饶阳县| 宽城| 平武县| 莲花县| 金门县| 贞丰县|