【深入理解java虚拟机】第3集-动态代理的原理之CGLIB

12 篇文章 0 订阅
1 篇文章 0 订阅

上面一篇文章JDK动态代理的原理讲到Java内部的JDK动态代理的原理,这一集讲一下CGLIB的原理

CGLIB生成代理类的工厂:Enhancer

看demo

public class EnhancerFactoryTest {
    /**
     * 生成新的代理
     * @param obj
     * @return
     */
    public static Object getEnhancher(Object obj) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setInterfaces(obj.getClass().getInterfaces());
        MethodInterceptor callBack =new MyMethodInterceptor();
        enhancer.setCallback(callBack);
        enhancer.setUseFactory(false);
        enhancer.setUseCache(true);
        return enhancer.create();
    }
}
public class MyMethodInterceptor implements MethodInterceptor {
    /**
     * 增强实现
     * @param proxy
     * @param method
     * @param args
     * @param methodProxy
     * @return
     * @throws Throwable
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        beforeProxy();
        Object result = methodProxy.invokeSuper(proxy, args);
        afterProxy();
        return result;
    }

    private void beforeProxy() {
        System.out.println("before Enhancer");
    }

    private void afterProxy() {
        System.out.println("after Enhancer");
    }
}
public class SelfBean implements SelfInterface {
    @Override
    public String getName() {

        System.out.println("selfBean");
        return "this is SelfBean";
    }
}

调用 EnhancerFactoryTest的getEnhancer()方法时生成新的Class

CGLIB较JDK复杂,生成了三个新的Class文件

真正的新代理对象是第二个

新的代理类有两个方法,CGLIB$getName$0()和getName()

两个方法实现不一样,第一个没有增强,直接调用了父类SelfBean的getName().第二个有增强,调用了MethodInterceptor的增强方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值