Java代理详解:JDK 动态代理执行流程

Java 动态代理详解 Java 动态代理详解,包括JDK动态代理和CGLIB动态代理 阅读详情

下面的流程讲解基于Java——代理  

JDK 动态代理执行流程(以上面文章的代码为例代码为例):

1.创建代理对象

执行 new ZFU(new ZF()).aa() 时,Proxy.newProxyInstance() 动态生成一个实现 ZFF 接口的代理对象:
  • 参数 1:复用目标类(ZF)的类加载器
  • 参数 2:指定代理类需实现 ZFF 接口(因此可被 ZFF 类型接收)
  • 参数 3:绑定当前 ZFU 对象(实现 InvocationHandler 接口,作为代理逻辑处理器)

2.调用代理对象方法

当执行 zff.zf("A", "B", 100.00) 时:
  • 由于 zff 是动态生成的代理对象(实现 ZFF 接口),调用其 zf() 方法会被 JDK 拦截

3.转发至 invoke () 方法

JDK 将拦截到的调用转发给绑定的 InvocationHandler(即 ZFU 对象)的 invoke() 方法:
  • method 参数自动传入被调用的方法(即 ZF 类的 zf() 方法)
  • args 参数自动传入调用时的参数("A","B",100.00)
执行增强逻辑与目标方法

4.在 invoke() 方法中:

  • 可添加自定义增强逻辑(如参数验证、日志等)
  • 通过 method.invoke(o, args) 反射调用目标对象(ZF 实例)的真实 zf() 方法,执行核心业务逻辑(打印支付信息)
核心逻辑链:
代理对象方法调用 → JDK 拦截并转发 → InvocationHandler 的 invoke () → 执行增强逻辑 + 反射调用目标方法
注:

1.为什么调用 zff.zf () 会进入 invoke ()?

  • 因为 Proxy.newProxyInstance() 方法的第三个参数传入了 this(当前 ZFU 对象,它实现了 InvocationHandler 接口),JDK 在动态生成代理对象时,会将这个 InvocationHandler 与代理对象 “绑定”。
  • 当你调用代理对象的 zf() 方法时,JDK 底层会自动触发绑定好的 InvocationHandler(也就是你的 ZFU 对象)的 invoke() 方法,并把当前调用的方法(zf())、参数("A","B",100.00)等信息传递给 invoke() 方法。
  • 这个绑定关系是 JDK 动态代理的核心机制 —— 通过传入 InvocationHandler,告诉代理对象 “当方法被调用时,该找谁处理”,从而实现了方法调用的转发。

2.代理类指的是Proxy.newProxyInstance() 动态生成的匿名类(由 JDK 在运行时创建),这个类才是实现了 ZFF 接口的 “代理类”,它会 “冒充” 目标接口的实现类,接收外部方法调用,并将调用转发给 ZFU 的 invoke() 方法。。ZFU 类不是代理类,它是 InvocationHandler 的实现类(代理逻辑处理器),负责定义 “方法被调用时要执行的增强逻辑”(比如参数验证、日志等),并通过 invoke() 方法接管代理对象的方法调用。

3.代理类的作用

  • 实现目标接口
代理类会实现目标对象所实现的接口(如代码中的 ZFF 接口),因此可以被接口类型接收(如 ZFF zff = ...),从语法上 “冒充” 目标接口的实现类,让外部调用者可以像使用目标对象一样使用代理对象。
  • 拦截接口方法调用
代理类会重写接口中的所有方法(如 zf() 方法)。当外部调用这些方法时,代理类不会直接执行目标对象的方法,而是将调用拦截并转发给绑定的 InvocationHandler(如代码中的 ZFU 对象)的 invoke() 方法。
  • 传递调用信息
在转发过程中,代理类会将 “当前调用的方法(Method 对象)”“传入的参数(args 数组)” 等信息打包,作为参数传递给 invoke() 方法,让 InvocationHandler 可以知晓并处理具体的调用细节。

4.Proxy.newProxyInstance()第一个参数

在 Java 中,获取类加载器主要有两种常见方式:
  • 通过类名获取:类名.class.getClassLoader()
例如 JdkPoxy.class.getClassLoader(),这里的 JdkPoxy.class 是获取该类的字节码对象,再通过 .getClassLoader() 得到加载这个类的类加载器。
  • 通过对象实例获取:对象.getClass().getClassLoader()
例如 o.getClass().getClassLoader(),这里的 o 是某个类的实例,o.getClass() 会返回该实例对应的类的字节码对象,再获取其类加载器。
这两种方式的本质是一样的 —— 都是通过「类的字节码对象」获取类加载器,只是获取字节码对象的途径不同(一个直接通过类名,一个通过实例)。
在动态代理中,只要能拿到一个「有效的类加载器」即可,无论这个类加载器来自哪个类(只要它有能力加载相关的类)。所以实际开发中,这两种写法都很常见,根据代码上下文选择更方便的即可。

5.Proxy.newProxyInstance()第二个参数

第二个参数,是不是必须要实现接口,否则不能通过jdk的这种动态代理,只能使用其他的。因为JDK 动态代理的核心机制就是基于接口实现的,这是由其设计原理决定的:
  • 第二个参数的作用:o.getClass().getInterfaces() 是获取目标对象所实现的所有接口。JDK 动态代理会基于这些接口动态生成一个代理类,这个代理类会实现与目标对象相同的接口。
  • 必须实现接口的原因:
  • JDK 动态代理生成的代理类本质上是 "实现了目标接口" 的新类
  • 当你调用代理对象的方法时,实际是调用了接口中定义的方法
  • 如果目标对象没有实现任何接口,getInterfaces()会返回空数组,此时 JDK 无法生成代理类,会抛出IllegalArgumentException异常
  • 解决方案:
    • 如果目标类有接口:可以正常使用 JDK 动态代理
    • 如果目标类没有接口:必须使用其他代理方式,最常用的是CGLIB 代理(基于继承目标类实现)
简单说:JDK 动态代理是 "接口导向" 的,必须要有接口才能工作;没有接口时,就需要用 CGLIB 等基于继承的代理方式。

6.Proxy.newProxyInstance()第三个参数

Proxy.newProxyInstance() 方法的第三个参数确实需要传入一个实现了 InvocationHandler 接口的对象。这是 JDK 动态代理的核心设计,它的工作流程可以简单理解为:
  1. 当你通过代理对象(代理类的实例)调用任何方法时(这些方法都是目标接口中定义的)
  2. JDK 会自动拦截这个调用,不会直接执行目标对象的方法
  3. 转而执行你传入的 InvocationHandler 对象的 invoke() 方法
  4. 在 invoke() 方法内部,你可以:
  • 添加增强逻辑(比如你的 YZNameA()、YZNameB() 等验证方法)
  • 通过 method.invoke(o, args) 手动调用目标对象的原始方法
  • 对返回结果进行处理
在你的 ZFU 类中,this 之所以可以作为第三个参数,正是因为 ZFU 类本身实现了 InvocationHandler 接口,所以 this 就是一个符合要求的 InvocationHandler 实现对象。
简单说:第三个参数是「拦截器」,所有对代理对象的方法调用都会被它拦截并处理,这也是动态代理能实现 "增强" 功能的关键所在。
【车载开发系列】ParaSoft单元测试环境配置(一) bdf是数据文件的一种类型,表示一种数据库文件。在ParaSoft当中,可以使用bdf文件来快速创建一个测试项目。 阅读详情

相关推荐

解决Surface更新后Bitlocker无限循环的问题

在Surface系统更新以后,出现要求输入Bitlocker恢复密钥的问题。已经输入正确密钥以后,依然无法正常进入Windows操作系统,一旦重启依然循环Bitlocker要求输入密钥的界面。 一旦到登录界面,点击“登录”之后又跳转回登录界面.,但就是无法进入桌面。 解决方案: 拒绝暴力重装!这个问题是Bitlock把盘给锁了,所以要解锁 重启之后,直接点击右下角“跳过这个驱动器” 选择“疑难解答”,然后进入命令提示符 先查看判断现在是不是被锁了: 输入: manage-bde -status c

premierapp的博客 1万+

Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点 也分析了一下静态代理的缺点: 1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类 2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码 3、由第一点和第二点可以得出:静态代理的重用性不强 那怎...

曹举的个人博客 2万+

VisionMaster SDK C#二次开发核心技术指南

以下是基于**VisionMaster SDK C#二次开发核心技术指南**,结合实战案例与关键代码解析,帮助开发者快速掌握工业视觉应用集成。

东城十三 3064

Java中的JDK动态代理

Java中JDK动态代理,AOP是对动态代理的进一步规范化,CGLB动态代理

weixin_44362089的博客 5562

卫星测试科普(三):卫星载荷的核心测试设备探秘

总的说来,卫星芯片与元器件,部组件与单机,整机与子系统,系统与整星的设计、定型、制造、验证、总装、发射、在轨等环节都离不开各种测试场景,对于这些卫星测试场景而言,“射频三大件”与高速数字示波器是构成强大测试系统的基础。卫星通信信号生成:覆盖Ka、Q等波段,具备扫频、脉冲、数字调制、噪声信号、雷达信号、数据链信号、OFDM 等多种信号库,用于测试和验证卫星电子设备的电气性能、频率响应、抗干扰能力等。卫星的通信需要高效、快速地传输大量数据,高速信号的质量至关重要,如果卫星信号不佳,卫星就会出现故障或者隐患。

spwbjss的博客 2320

平衡电桥检测高压绝缘电阻的原理

检测绝缘漏电的高压拓扑如下:BMU需要连接BAT+,BAT-和PE线,并测量电池总压(Ubatt)和负母线电压(Un),并计算出正母线电压(Up)。

booksyhay的专栏 1万+

Java动态代理大揭秘:JDK代理 vs CGLIB代理详解

本文将带你深入了解Java动态代理的两大主流实现方式——JDK动态代理和CGLIB动态代理。通过丰富的示例和详细的对比,帮助你理解它们的工作原理、优缺点以及适用场景。无论你是刚接触动态代理的新手,还是希望提升技术深度的开发者,都能从中获得实用的知识和技巧。

2301_80795057的博客 4万+

ubuntu20.04下dsp-slam的运行配置

DSP-SLAM:具有深度形状先验的面向对象的 SLAM

baidu_38431960的博客 3159

JDK动态代理详解

可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的Spring中的注解,其依赖于AOP,而AOP的底层实现便是动态代理,看到这里,是不是更有兴趣去了解动态代理了呢?动态代理:可以分解为“动态”+“代理”。所以,静态代理存在一定的局限性,不能很好的满足需求的千变万化,动态代理的出现,就是为了解决这些局限性。

StoNENee的博客 4729

ICDAR数据集简介

ICDAR(文档分析与识别国际会议)是OCR领域的权威会议,每两年发布一次数据集,专注于‌自然场景文本检测与识别‌,涵盖多语言、复杂版式和真实环境挑战。街景、广告牌、票据、手写文档等真实场景图像。包含水平、垂直、倾斜、弯曲文本,背景干扰大,部分文本存在遮挡或模糊。提供文本位置坐标(矩形/四边形框)及内容,无法识别的文本标记为###。以上总结提炼了ICDAR的核心价值与应用方法论。给出最佳实践方法是官网数据预训练模型 + 业务数据微调(比如用PPOCRLabel标注100+张业务图)。

xinghaitao2005的博客 1118

树莓派4B学习笔记一

树莓派4b烧录Ubuntu20.04&&配置Ubuntu桌面

m0_55202222的博客 3643

Java——JDK动态代理

动态代理是指代理类对象在程序运行时由JVM根据反射机制动态生成的。动态代理不需要定义代理类的,java源文件。动态代理其实就是jdk运行期间,动态创建class字节码并加载到JVM。动态代理的实现方式常用的有两种:使用JDK代理,与通过CGLlB动态代理。

m0_73671382的博客 7677

【软考高级架构】论文范文16——论分布式缓存架构设计及其应用

随着互联网业务的快速发展,高并发访问和海量数据处理对系统响应时间提出了极高要求,传统基于磁盘的数据库存储已难以满足毫秒级的性能需求。分布式缓存作为一种高性能、可扩展的数据存储中间件,能够有效减轻后端数据库压力、加速热点数据访问、提升系统吞吐量,已成为高并发系统架构中的核心组件。本文以笔者主导的某大型电商平台秒杀系统建设项目为案例,围绕分布式缓存架构设计展开论述。笔者担任系统架构师,主导了缓存选型、数据分片策略、缓存一致性方案、高可用架构及缓存穿透/雪崩/击穿防护机制的设计与落地。

qq837993702的博客 163

静态代理,JDK动态代理,Cglib动态代理详解

关注微信公众号【Java之言】,更多干货文章和学习资料,助你放弃编程之路! 文章目录一、代理模式二、静态代理三、动态代理 一、代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式,他的特征是代理类和委托类实现有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类对象与一个委托类对象(目标对象)关联,代理类对象本身并不真正实现服务,而是通过调用委托类对象的相关方法,来提供特定的服务。 .

陈皮的JavaLib 2848

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java动态代理:jdk动态代理和cglib动态代理

java动态代理

记录学习点滴 3318

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java中JDK动态代理详解

类加载器 ,因为我们生成的这个代理对象是没有.java源文件的,是在运行时直接生成的一个.class的二进制字节码文件,他既然直接生成一个.class二进制文件的,那么它是需要去加载,被加载到Java的运行时数据区,所以他就需要一个类加载器。类加载器还有另一个重要的功能,那就是隔离加载类的命名空间。不同的类加载器可以加载同名的类,但是由不同的类加载器加载的类属于不同的命名空间,互不干扰。它不仅负责加载类,还负责对类进行校验,解析和初始化,以及隔离加载类的命名空间。:当前的方法中,我要增强的那个方法。

Upup! 1458

STM32F407中文手册

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

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

浅谈java代理 静态代理动态代理 JDK动态代理和CGLIB动态代理

园区阿祖的博客 1313

Java动态代理之JDK动态代理

在介绍动态代理前,我们需要先搞清楚什么是代理模式。代理模式是一种很常见的设计模式,简而言之就是通过创建一个代理对象,让调用方来访问代理对象,从而实现对真实对象的保护或增强。Spring AOP、Mockito测试框架生成的mock或spy对象都是代理模式的例子。其实,代理并不是一个编程中才有的概念,生活中委托中介帮忙租房子,或者找律师打官司,都可以看作代理模式的应用。这样我们就完成了代理模式的编写,下面可以写个测试类看看效果输出结果为。

weixin_47372115的博客 868

JAVA JDK动态代理图解

JAVA的动态代理是一个非常重要的实现技术,在jdk以及spring,hibernate等框架中大量应用。 为什么动态代理这么重要呢?首先,什么是动态,什么是代理? 动态是相对静态而言,如java是先编译后运行,那么其代码是静态方式被读取和编译的,也可以说java是静态的语言,如果你想在一个java程序在编译之后的运行时期再去临时编译某个类从而获得实例对象,通常情况下是不能实现的,例如:new

ShewMi的专栏 2907

碎碎念念-动态代理:JDK动态代理

本文小结了Java语言中的JDK动态代理技术,分析其底层原理并进一步说明在rpc框架中的应用

one2excellent的博客 1217

jdk动态代理和cglib代理

SpringAOP在目标累实现接口的情况下,默认采用JDK的动态代理方式进行目标类的代理。基于CGLIB的动态代理,底层是利用ASM技术实现的,ASM动态生成目标类的子类的字节码。我们的目标类是Bus,他实现了接口Car,然后我们实现一个JdkDynamicProxyTest,JdkDynamicProxyTest持有Bus,在调用invok的时候,织入增强逻辑。CGLIB代理类代理类是目标类的子类,依赖CGLIB.JAR。cglib封装了asm,可以在运行期动态生成新的class。...

weixin_39825906的博客 3425

JDK动态代理:深入解析Java动态代理的核心实现

JDK 动态代理通过 运行时生成代理类字节码 + 统一方法转发到 InvocationHandler 实现动态代理。其设计优雅地结合了 Java 反射机制与类加载机制,成为 Java 生态中 AOP 和中间件开发的基础技术。尽管存在接口依赖的限制,但在 Spring 等框架的巧妙封装下,仍被广泛应用于企业级开发。

张小洛的BOLG 1256

JDK动态代理模式详解

常用的代理模式有,jdk动态代理s和CGLIB动态代理模式,JDK动态代理是java.lang.reflect.*包提供的方式,它必须提供一个接口才能产生代理对象。 下面讲解jdk动态代理,如下图: 假设有这样一个场景,你的公司是一个软件公司,你是一位软件工程师,客户带着需求过来,显然不会先去直接找你,而是去找一个叫商务对象的人,此时商务就是代理你的人,同时也是与客户交谈的人。 ...

Dream_it_possible!的博客 1533

JDK 动态代理

首先,我们定义一个Service接口,用于定义业务操作。

2401_85480529的博客 1142

【JDK动态代理】及【CGLib动态代理】:Java的两种动态代理方式

动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作

A-Itfuture的博客 2337

JDK动态代理的执行过程分析

目录 JDK动态代理的执行过程分析 JDK动态代理和CGLib动态代理的区别 JDK动态代理的执行过程分析 前提:创建一个目标类和测试类进行动态代理执行过程的分析 目标类:CalculatorService package com.jd.calculator; public class CalculatorService implements ICalculatorServ...

qq_42865575的博客 1301
上一篇: SpringMVC概述
下一篇: 9 IO流
L.S.L_
博客等级 码龄3年 129粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值