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

spring--CGLIB动态代理的实现原理的更多相关文章

  1. jdk动态代理和cglib动态代理底层实现原理详细解析(cglib动态代理篇)

    代理模式是一种很常见的模式,本文主要分析cglib动态代理的过程 1. 举例 使用cglib代理需要引入两个包,maven的话包引入如下 <!-- https://mvnrepository.c ...

  2. jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

    代理模式是一种很常见的模式,本文主要分析jdk动态代理的过程 1.举例 public class ProxyFactory implements InvocationHandler { private ...

  3. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式, ...

  4. cglib源码分析(四):cglib 动态代理原理分析

    本文分下面三个部分来分析cglib动态代理的原理. cglib 动态代理示例 代理类分析 Fastclass 机制分析 一.cglib 动态代理示例 public class Target{ publ ...

  5. Spring源码剖析5:JDK和cglib动态代理原理详解

    AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理. 转自https://www.jiansh ...

  6. CGLib动态代理原理及实现

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  7. java cglib动态代理原理及样例

     cglib动态代理: http://blog.csdn.net/xiaohai0504/article/details/6832990 一.原理 代理为控制要访问的目标对象提供了一种途径.当访问 ...

  8. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  9. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  10. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

随机推荐

  1. 10 个免费的 AI 图片生成工具分享

    原文: https://openaigptguide.com/ai-picture-generator/ 在人工智能(AI)图像生成技术的推动下,各类AI图片生成网站如雨后春笋般涌现,为我们的日常生活 ...

  2. 探究vue的diff算法

    1.diff算法是什么? diff算法是一种通过**同层的树节点**进行比较的高效算法 Diff 算法探讨的就是虚拟 DOM 树发生变化后,生成 DOM 树更新补丁的方式.对比新旧两株虚拟 DOM 树 ...

  3. String与StringBuilder的互相转换

    String与StringBuilder的互相转换 String转StringBulider StringBuilder sb = new StringBuilder(); sb.append(use ...

  4. Codeforces 918(div4)

    Codeforces 918(div4) Problem - A - Codeforces #include<bits/stdc++.h> using namespace std; con ...

  5. Ubuntu系统 安装 Zabbix Server 6.0

    Zabbix6.0简介: zabbix6.0新特性 1.开箱即用的Zabbix server高可用群集 Zabbix server高可用防止硬件故障或计划维护期的停机: 原生选择加入HA群集配置 定义 ...

  6. CTFHub 栈溢出 ret2text exp代码

    exp代码: from pwn import * host='challenge-1868f48f1e630fd3.sandbox.ctfhub.com' port=27988 p=connect(h ...

  7. Proxy下的Prepare透传,让GaussDB(for MySQL)更稳固,性能更卓越

    本文分享自华为云社区<Proxy下的Prepare透传,让GaussDB(for MySQL)更稳固,性能更卓越>,作者: GaussDB 数据库 . 1.引言 在很多业务场景下,数据库应 ...

  8. Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案

    本文分享自华为云社区<Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案>,作者: GaussDB 数据库 . 近日, Navicat Premium顺利 ...

  9. 微服务架构下,DLI的部署和运维有何奥秘?

    摘要:探讨DLI两个问题:如何在生产环境中部署与运维实现快速迭代上线,如何实现监控告警来提升整体运维能力. 华为云数据湖探索DLI是支持多模引擎的Serverless大数据计算服务,其很好的实现了Se ...

  10. 华为云MVP周峥:气象预报是个技术活,大数据、超算、AI,缺一不可

    摘要:在这样一个关乎民生的行业里,人工智能.大数据.超算这些技术,可发挥的潜力也是无限的,华为云MVP周峥就是其中的技术践行者,他正带领着团队为国内气象行业带来一股温柔而不失力量的春风. 本文分享自华 ...