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. 同样的SQL,怎么突然就慢了?

    本篇文章素材来源于某银行系统的一次性能问题分析. 许久没写这种troubleshooting类型的技术文章了,因为曾在服务公司呆过多年,工作原因,这方面之前做的多,听的更多,导致已经达到在自己认知维度 ...

  2. python获取已安装程序列表

    python获取已安装程序列表 本文主要讲述通过python脚本获取android 设备已安装列表. 首先,Python本身无法直接获取Android设备上已安装的程序列表,所以这里主要借助adb命令 ...

  3. selenium之鼠标键盘操作

    鼠标操作 1.引入ActionChains类 2.定位相关元素 3.在ActionChains().调用相关鼠标操作方法 from selenium.webdriver.common.action_c ...

  4. 【scikit-learn基础】--『监督学习』之 均值聚类

    聚类算法属于无监督学习,其中最常见的是均值聚类,scikit-learn中,有两种常用的均值聚类算法:一种是有名的K-means(也就是K-均值)聚类算法,这个算法几乎是学习聚类必会提到的算法:另一个 ...

  5. C#判断字符串是否是有效的XML格式数据

    说明 在try-catch语句块中,创建XmlDocument对象,并使用LoadXml方法加载xml字符串.如果没有异常,则说明xml字符串是有效的,返回true,反之为false. 代码实现 // ...

  6. 创建service后,kubernetes会发生什么

    本文分享自华为云社区<当创建一个service后,kubernetes会发生什么?>,作者:可以交个朋友. 一.Service介绍 1.1 Kubernetes为什么会引入service? ...

  7. C++多线程强制终止

    摘要:实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们. 本文分享自华为云社区<如何编写高效.优雅.可信代码系列(1)--C++多线程强制终止>, ...

  8. 解析鸿蒙内核消息队列QueueMail接口的哼哈二将

    摘要:本文带领大家一起剖析了鸿蒙轻内核的队列模块的QueueMail两个接口的源代码. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三(续) 消息队列QueueMail接口>,作者: ...

  9. 如何用Xcode安装ipa

    Xcode安装ipa iOS APP上架App Store其中一个步骤就是要把ipa文件上传到App Store!​ 下面进行步骤介绍!​ 利用Appuploader这个软件,可以在Windows.L ...

  10. Solon Aop 特色开发(2)注入或手动获取Bean

    Solon,更小.更快.更自由!本系列专门介绍Solon Aop方面的特色: <Solon Aop 特色开发(1)注入或手动获取配置> <Solon Aop 特色开发(2)注入或手动 ...