动态代理:JDK代理原理解析

Java动态代理原理与实战:JDK与CGLIB深度解析 动态代理是Java编程中实现AOP(面向切面编程)的核心技术,通过在运行时动态生成代理类来实现方法拦截。其核心原理基于Java反射机制和字节码生成技术,JDK动态代理通过Proxy类和InvocationHandler接口实现,而CGLIB则采用继承方式操作字节码。这种技术能有效解耦横切关注点,在Spring AOP、RPC框架、事务管理等场景中广泛应用。从性能角度看,JDK动态代理适合接口代理,CGLIB则能处理普通类,两者在Spring生态中形成互补。掌握动态代理技术对理解现代Java框架如MyBati 阅读详情

概要

代理模式结构

  代理可分为2类对象:
  目标类:一个是真正的你要访问的对象,原来的逻辑实现者。
  代理类:一个是代理对象,从抽象层看,他包含了原来的逻辑与需要额外增加的代理/增强逻辑。
  真正对象与代理对象实现同一个接口(实际上也可能是继承Cglib),先访问代理类再访问真正要访问的对象。
  代理模式分为静态代理、动态代理。
    静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
    动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。

代理模式抽像图与类图

概念抽象图:
  调用者只关心代理类,对代理类的调用,都将对增强类与目标类(被代理类)先后发起调用。以此达到代理或者功能增强的效果。实际操作中,jdk代理,cglib代理都把代理类拆分出一人增强类接口(增加与代理逻辑),达到代理类与增强类通过接口解耦。
  
这里写图片描述

jdk/cglib抽象流程与图:

  • 代理类:与目标类实现同一个接口(可以多个),或者代理类继承了实现类。则可对所有接口方法或者类方法进行代理。
  • 增强类:在调用目标类代理方法前后增加的逻辑处理,如安全检查;日志记录、统计;事务开启、回滚、关闭等等。一般都需要实现InvocationHandler或者MethodInterceptor接口。
  • 代理类一般持有增强类的实例,当客户调用代理类方法时,将会调用增强类方法,在增强类方法中,则做额外逻辑处理或者目标类方法的调用。
  • 代理类一般会有Method类似变量,有多少个代理方法,至少有多少个这种变量。在实际调用代理方法时,此方法可作为参数,传递给增强类的invoke/intercept方法,以便在后续通过反射调用目标类方法。
    这里写图片描述

JDK的动态代理

JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程。JDK从1.3开始支持动态代理。

JDK提供了java.lang.reflect.Proxy类来实现动态代理的,可通过它的newProxyInstance来获得代理实现类。而代理逻辑的增强,则是通过实现接口java.lang.reflect.InvocationHandler来完成,它提供了一个invoke方法供实现者提供相应的代理逻辑的实现。

JDK动态代理主要逻辑描述

  1. 代理类与被代理类实现同样的接口列表,并且使用相同的类加载器。
  2. 增强类实现InvocationHandler接口,在invoke方法中完成代理增强逻辑,并于此方法中反射调用目标类的方法,故增强类也是需要持有目标类的实例的。
  3. 代理类通过Proxy类创建(通过newProxyInstance、getProxyClass方法创建)。
  4. 代理类承继了Proxy,并且通过带参构造函数InvocationHandler初始化。传入了增强类的实例到父类Proxy变量h,所以代理类持有了增强类的实例。
  5. 此时,代理类持有了增强类的实例,增强类持有了目标类的实例。调用者使用代理类时,都会调用到增强类的invoke方法,并且传入了Method参数(目标类接口方法签名)。而增强类则在invoke方法中,通过持有的目标类实例与此Method参数,反射调用到目标类方法。(当前在invoke方法中,还可以做些额外的增强逻辑)至此完成了代理操作。

JDK动态代理实现类图:
这里写图片描述

关于JDK如何生成代理类的细节在此不再赘述,造重复的轮子了, 详见转载深度剖析JDK动态代理机制

下一篇:动态代理:Cglib代理原理解析


以上为个人观点,若有错误或者疏漏,欢迎指正。^_^

jdk与cglib动态代理与底层实现 代理模式详解-jdk与cglib动态代理与底层实现,spring中常用的设计模式,本案例是从源码到代理模式的实现。 立即下载

相关推荐

手把手教你设计2bit反射型超表面:从单patch扫参到pin管配置全流程

本文提供了一份2bit反射型超表面设计的完整工程实践指南。从单贴片谐振器的参数化扫描与“270度法则”应用,到PIN二极管等效电路模型的获取与集成,再到利用参数化扫描高效仿真四种工作状态,手把手指导读者完成从单元设计到阵列布局、偏置线集成及加工考量的全流程,旨在帮助射频工程师将概念转化为可加工测试的实体模型。

java5的博客 1012

jdk动态代理底层原理

注意,动态代理虽然不用我们来像静态代理那样写代理类,是因为jdk动态代理通Proxy.newProxyInstance()帮助我们实现了,还是会生成字节码对象的。注意,这里的invoke和InvocationHandler中的invoke不一样,前者是反射中执行Method的方法。2):Method method:执行目标方法(就是需要增强的方法),通过反射中的invoke执行,jdk动态代理它的底层原理到底是什么,通过获取生成的代理对象的字节码文件.class,观察底层原理。①:需要创建代理的类加载器。

这个人很懒,什么都没有写 727

手把手教你用 Docker 构建自己的 CentOS 基础镜像

目录一、准备CentOS基础镜像二、撰写Dockerfile三、构建Docker镜像四、生成Docker容器 相信码农们经常会听说:虚拟机将成为历史,Docker才是未来 !!! 事实如此,现在大部分公司都在用 Docker 技术,想拥有自己的 Docker 专属镜像,那么 Dockerfile 就是入门,现在让我们一起来看一下 ------ 构建 Docker 镜像的全过程。 好文章 记得收藏...

Nick.Peng's Blogs 1万+

快速深入理解JDK动态代理原理

简单总结一下,JDK 动态代理的实现原理是动态创建代理类并通过指定类加载器进行加载,在创建代理对象时将InvocationHandler对象作为构造参数传入。当调用代理对象时,会调用 InvocationHandler.invoke() 方法,从而执行代理逻辑,并最终调用真正业务对象的相应方法。

程序员高级码农的博客 1361

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道

本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。

weixin_30296405的博客 84

Camera metadata

Camera metadata

weixin_42136255的博客 2522

一文带你了解JDK动态代理的原理

一文带你了解JDK动态代理的原理

langfeiyes的博客 4241

WPF数据可视化:LiveCharts自定义X轴与Y轴的5个实战技巧(附完整代码)

本文详细介绍了在WPF应用中使用LiveCharts进行数据可视化时,自定义X轴与Y轴的5个核心实战技巧。内容涵盖精确控制刻度步距、深度定制视觉样式、实现多轴布局对比、优化显示空间以及构建响应式动态轴,并提供了完整的C#和XAML代码示例,帮助开发者创建专业且用户体验出色的图表。

moss5的博客 686

代理模式-动态代理

代理模式

北执南念的博客 1156

2026年OPPO嵌入式岗位面试题带详细答案

本文总结了OPPO嵌入式岗位面试的核心考点,涵盖硬件驱动、系统启动、Linux内核开发等7大模块共34道典型题目。重点解析了SPI通信协议、中断处理、U-Boot启动流程、Linux驱动开发等关键技术,突出硬件调试与工程实践能力考核。题目设置贴合实际岗位需求,适合校招与社招驱动开发岗位应聘者系统复习,帮助掌握嵌入式开发的核心知识与面试要点。

Open 479

C#实战:YOLOv5+海康工业相机上位机开发全攻略(从图像采集到检测落地)

工业场景下AI质检系统的开发需要综合考虑硬件适配性、算法性能和稳定性。本文针对新能源电池极片缺陷检测场景,提出基于海康工业相机+YOLOv5+C#的技术方案,涵盖以下关键点: 工业级技术选型:选择支持全局快门的海康相机、OpenCvSharp图像处理、YOLOv5s轻量化模型,确保在无GPU工控机上稳定运行。 开发流程优化: 海康SDK集成:详细说明DLL配置和常见报错解决方案 YOLOv5模型导出:强调batch=1、opset12等工业适配参数 相机采集封装:提供线程安全的C#封装类,支持触发采集模式

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1188

Spring原理学习(五):一篇讲清楚动态代理(jdk和cglib)的使用、原理和源码

在下面的模拟中,我们的代理目标是Target类,他实现了Foo接口。在main方法中,我们模拟jdk实现动态代理的方法,来模拟实现AOP代理增强。需要注意的一点是:jdk只能针对接口代理。运行结果:需要注意:代理对象Proxy 和 代理目标Target是兄弟关系,他们都实现了Foo接口。所以,目标类Target也可以是final类型,这点与cglib实现的动态代理不同。

m0_49499183的博客 2689

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1893

深入探索JDK动态代理:从入门到原理的全面解析

为了调试目的,我们要查看或修改这些动态生成的代理类,正常我们还需要反编译工具(比如JD-GUI或JAD)来查看生成的类的源代码,但是我们不用那么麻烦,直接用IDEA打开即可。在标准的Java JDK实现中,生成的动态代理类(字节码)默认是在内存中动态生成并直接加载的,不会写入磁盘成为文件。现在,我们可以编写一个测试类来验证动态代理的使用,这个例子中,我们通过动态代理实现了一个代理对象,当调用代理对象的方法时,会先执行。添加了这个系统属性后,当创建动态代理实例的时候,JVM会将生成的代理类以。

Apple_Boy的博客 3249

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring AOP代理深度解析:JDK动态代理与CGLIB的底层原理与实战陷阱

在Java企业级开发中,AOP(面向切面编程)通过动态代理机制实现横切逻辑的织入,而Spring AOP的底层正是依赖JDK动态代理与CGLIB两种技术。JDK动态代理要求目标类实现接口,利用反射的InvocationHandler统一拦截方法调用;CGLIB则通过字节码生成目标类的子类,借助MethodProxy实现高效增强。Spring Boot 2.x后默认采用CGLIB,旨在提升类型兼容性并规避代理失效问题。理解两者的原理差异,不仅是面试高频考点,更直接关系到事务管理、切面拦截、异步注解等功能的正确

weixin_34413802的博客 546

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spring AOP原理深度解析:代理模式、JDK动态代理与CGLIB

本文深入解析Spring AOP的实现原理与技术选型。首先介绍了AOP的核心概念与设计理念,通过对比传统OOP与AOP的代码结构,展示AOP在解耦横切关注点方面的优势。随后详细剖析了JDK动态代理与CGLIB字节码增强两种代理机制,包括实现原理、性能对比和适用场景。在Spring AOP实现部分,重点分析了拦截器链的设计和执行流程,以及不同通知类型的执行顺序。文章还提供了企业级应用场景下的实战案例,如分布式链路追踪和多数据源事务管理,并针对常见问题给出了解决方案。最后从性能优化、技术选型和未来发展趋势等维度

七夜zippoe的博客 1671

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度解析AOP注解实现原理:JDK动态代理、CGLIB动态代理及应用场景

Spring容器启动解析切面、切点、注解等元信息,通过代理织入逻辑,无需业务代码变动即可横切增强。**JDK代理适合有接口类;CGLIB适合无接口类。**建议业务层代码尽量对接口编程。代理对象里调用同类非代理方法(即“内部方法调用”)不会触发AOP增强,核心逻辑应避免在同类里直调。对于性能敏感型项目,建议关注不同代理实现的开销差异,合理选择。AOP注解极大提升项目可维护性和扩展性,适合所有横切关注点的场景。

Wanankl的博客 1069

代理模式全解析:从静态到 JDK 动态代理,原理、实战与面试指南(万字长文)

本文深入解析JDK动态代理机制,从原理到实践全面讲解。文章首先介绍代理模式基础,对比静态代理与动态代理的优缺点;其次剖析JDK动态代理的核心组件(Proxy类、InvocationHandler接口)和实现原理,通过源码示例展示动态生成的代理类结构;然后列举Spring AOP日志记录、事务管理等典型应用场景;最后整理高频面试题,并给出性能优化策略与CGLIB代理的对比。全文系统性地阐述了JDK动态代理这一Java核心技术,帮助开发者掌握无侵入式接口增强的实现方式,并理解其在企业级开发中的实际应用价值。

专注于 Java 后端架构、微服务、分布式、前端及 AI 领域的技术分享,是开发者获取硬核知识、交流实战经验的专业博客。 1355

JDK动态代理与CGLIB动态代理深度解析:原理、区别与应用场景

JDK动态代理与CGLIB动态代理深度解析:原理、区别与应用场景

嗨,欢迎来到我的 CSDN 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1109

【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析

本文深入解析Spring AOP的核心实现技术——JDK动态代理与CGLib动态代理。首先从AOP的概念入手,阐述其解决代码复用痛点的原理,并详细介绍了切面、通知、切入点等核心概念。然后重点剖析JDK动态代理的实现机制,包括InvocationHandler接口和Proxy类的关键作用,通过日志代理的实战案例演示了代理对象的创建过程。文章还对比了两种代理方式的适用场景,帮助开发者理解Spring AOP的整体执行流程和技术选型依据。全文兼顾理论与实战,为掌握Spring AOP提供了全面的技术指南。

CodeSuc 的技术博客 2842

深入解析JDK动态代理:原理与应用

在Java应用程序中,JDK动态代理是一种强大的技术,它可以在运行时生成代理对象,实现对目标对象的透明包装和增强。JDK动态代理是Java标准库提供的一种实现方式,它为我们提供了一种优雅而灵活的方式来扩展和增强Java应用。本文将深入介绍JDK动态代理的概念、原理和使用方法。以及在Spring中的用法。

weixin_43885959的博客 363

Java——深入解析 CGlib 与 JDK 动态代理:原理、区别与实践

/ 目标接口void add();// 目标类(实现接口)@OverrideSystem.out.println("执行UserDao的add方法");System.out.println("执行UserService的update方法");接口依赖:JDK 动态代理强制要求目标类实现接口,CGlib 无此限制。性能:在多次调用场景下,CGlib 效率更高(因避免了反射开销)。限制:CGlib 无法代理 final 类或 final 方法(子类无法重写)。

2302_79926174的博客 847

Spring AOP 代理实现原理深度解析:JDK动态代理 vs CGLIB的终极对决

三个月后,小赵再次来到同一家公司面试。这次,他胸有成竹地坐在了老王面前。老王(惊讶):咦?小赵,你又来了?上次的问题研究明白了吗?小赵(自信满满):老王,这次我可是有备而来!您问我Spring AOP的代理实现原理,我现在可以从源码级别给您分析。老王(来了兴趣):哦?那你说说DefaultAopProxyFactory的createAopProxy方法是怎么选择代理策略的?小赵(滔滔不绝):这个方法有三层判断逻辑。

weixin_54726354的博客 750

Spring AOP核心原理:JDK与CGLib动态代理实战解析

Spring AOP动态代理机制解析 Spring AOP通过JDK和CGLIB两种动态代理实现无侵入式增强。JDK代理基于接口,运行时生成实现类;CGLIB通过继承目标类生成子类代理。Spring默认优先JDK代理(需接口),若无接口则用CGLIB,而Spring Boot 2.0+默认统一使用CGLIB保证一致性。配置可通过proxy-target-class切换,开发者需注意final方法等代理限制。

likuoelie的博客 756

LAMMPS compute inertia 命令详解:计算原子组相对质心的惯量张量

`compute inertia` 是 LAMMPS 中用于计算一个原子组(group)相对其质心的对称惯量张量的全局向量 compute。它在分子刚体动力学分析、转动动能计算、粒子形状对转动惯量贡献的评估等场景中扮演关键角色,并且对跨周期边界的原子采用“unwrapped(去包裹)”坐标处理。读完本文,你将掌握该命令的语法、输出格式、底层实现原理(包括有限尺寸粒子的自旋惯量贡献与平行轴定理),并

gitblog_00561的博客 846

深入解析JDK动态代理与CGLIB:从原理到Spring AOP选型

动态代理是Spring AOP实现事务、日志、权限控制等核心功能的底层基石,也是Java后端面试中绕不开的高频考点。JDK动态代理基于接口,通过JVM运行时生成实现指定接口的代理类,而CGLIB则基于继承,利用ASM字节码框架生成目标类的子类,从而突破接口限制。两种机制在字节码生成方式、方法调用路径上存在本质差异:JDK代理通过反射转发至InvocationHandler,CGLIB则通过FastClass索引直接调用父类方法,因此在JDK 9之前CGLIB的方法调用性能更优,但JDK 9后反射优化使差距大

weixin_32715349的博客 106
上一篇: MyBatis中#{}和${}的区别
下一篇: 动态代理:Cglib代理原理解析
老鼠尼奥
博客等级 码龄17年 7粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值