spring--CGLIB动态代理的实现原理

CGLIB(Code Generation Library)是一个强大的、高性能、高质量的代码生成库,它可以在运行时扩展 Java 类和实现 Java 接口。CGLIB 动态代理是基于继承的方式来实现的,它不需要接口,可以代理普通类。以下是 CGLIB 动态代理的实现原理:

  1. 继承:CGLIB 动态代理通过继承目标类来创建子类,并在子类中覆盖父类的方法。

  2. 代码生成:CGLIB 使用 ASM(一个 Java 字节码操作和分析框架)来操作和生成 Java 字节码,生成新的类。

  3. 方法拦截:CGLIB 提供了 MethodInterceptor 接口,它类似于 JDK 动态代理的 InvocationHandler。用户需要实现这个接口,并在 intercept 方法中定义拦截逻辑。

  4. 创建代理实例:通过使用 Enhancer 类(CGLIB 的类生成器),可以创建一个代理实例。Enhancer 允许设置父类(目标类)、回调(如 MethodInterceptor)等信息,并最终生成一个继承自目标类的代理类的对象。

  5. 方法调用处理:当调用代理实例上的方法时,CGLIB 会将调用重定向到 MethodInterceptor 实现的 intercept 方法。intercept 方法可以做一些额外处理,比如日志记录、权限验证等,然后通过反射调用目标类(父类)中的相应方法。

  6. 执行目标方法:在 MethodInterceptorintercept 方法中,你可以决定是否调用目标类的方法,以及如何调用。通常情况下,你会使用 MethodProxy 对象(intercept 方法的一个参数),它提供了 invokeSuper 方法来调用父类的原始方法。

  7. 返回结果:目标方法执行后的返回值可以被返回给代理对象的方法调用者,或者可以返回一个自定义的值。

CGLIB 动态代理的优点是它不需要目标对象实现任何接口,因此非常适用于代理类本身没有实现接口的情况。但是,由于它是通过继承来实现代理的,因此无法对 final 类或 final 方法进行代理。

总的来说,CGLIB 动态代理通过在运行时生成目标类的子类,并在子类中插入自定义的方法拦截逻辑,从而实现对目标类方法的代理。这种方法在不改变原有代码结构的情况下,为在目标对象的方法调用前后添加额外的处理提供了一种强大的方式。

posted @   xylfjk  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示