java动态代理解析 📅 发布时间:2026/7/8 14:38:32 👁️ 浏览次数: 动态代理是 Java 中一种非常重要的技术它允许我们在程序运行时动态地生成代理类并且可以在不修改目标类的情况下改变其行为。Java 提供了两种主要的动态代理方式JDK 动态代理和 CGLIB 动态代理。本文将分别介绍这两种方式并附上相应的代码分析以及比较他们见的区别。一、动态代理的概念动态代理是指在程序运行时通过某种方式生成一个实现了特定接口的代理对象。在 Java 中动态代理主要用于实现一些横切关注点如事务、日志、性能监控等的功能而不需要修改原有的业务逻辑代码。二、JDK 动态代理JDK 动态代理是基于 Java 反射机制实现的它要求目标对象实现至少一个接口。JDK 动态代理通过java.lang.reflect.Proxy类和InvocationHandler接口来实现。1. JDK 动态代理的原理JDK 动态代理生成的代理类是由 JVM 在运行时创建的它继承了Proxy类并实现了目标类的接口。在代理类中所有方法的调用都会被转发到InvocationHandler的invoke方法。2. JDK 动态代理的使用代码示例首先定义一个接口和实现类// 定义一个接口 public interface HelloService { void sayHello(String name); } // HelloService 的实现类 public class HelloServiceImpl implements HelloService { Override public void sayHello(String name) { System.out.println(Hello, name); } }然后创建InvocationHandler实现类import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target target; } Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(被代理方法执行前逻辑 method.getName()); Object result method.invoke(target, args); // 调用目标方法 System.out.println(被代理方法执行后逻辑 method.getName()); return result; } }接下来创建代理对象import java.lang.reflect.Proxy; public class ProxyDemo { public static void main(String[] args) { // 目标对象 HelloService helloService new HelloServiceImpl(); // 创建代理对象 HelloService proxy (HelloService) Proxy.newProxyInstance( helloService.getClass().getClassLoader(), helloService.getClass().getInterfaces(), new MyInvocationHandler(helloService) ); // 调用代理方法 proxy.sayHello(World); } }输出结果被代理方法执行前逻辑 sayHello Hello, World 被代理方法执行后逻辑 sayHello3. JDK 动态代理的特点只能对实现了接口的类生成代理。在运行时动态创建代理类透明地将方法调用转发给InvocationHandler。使用反射机制调用方法因此性能相对较低。4.特别提醒jdk生成的代理类在字节码里已经继承了Proxy类java为单继承所以只能通过实现接口的方式来生成代理类。三、CGLIB 动态代理CGLIBCode Generation Library是一个功能强大的高性能的代码生成库。与 JDK 动态代理不同CGLIB 动态代理不要求目标对象实现接口。它通过继承目标类并重写方法来创建代理对象。1. CGLIB 动态代理的原理CGLIB 通过字节码技术生成目标类的子类并重写其中的方法。CGLIB 动态代理的实现类通过继承目标类并重写目标类的方法来实现代理功能。2. CGLIB 动态代理的使用代码示例首先定义一个目标类public class HelloService { public void sayHello(String name) { System.out.println(Hello, name); } }然后创建 CGLIB 的代理类import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibProxyDemo { public static void main(String[] args) { // 创建目标对象 HelloService helloService new HelloService(); // 创建 Enhancer 对象 Enhancer enhancer new Enhancer(); enhancer.setSuperclass(HelloService.class); enhancer.setCallback(new MethodInterceptor() { Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println(被代理方法执行前逻辑 method.getName()); Object result proxy.invokeSuper(obj, args); // 调用父类方法 System.out.println(被代理方法执行后逻辑 method.getName()); return result; } }); // 创建代理对象 HelloService proxy (HelloService) enhancer.create(); // 调用代理方法 proxy.sayHello(World); } }输出结果被代理方法执行前逻辑 sayHello Hello, World 被代理方法执行后逻辑 sayHello3. CGLIB 动态代理的特点不要求目标对象实现接口。通过继承目标类并重写方法来实现代理。性能相对较好比 JDK 动态代理更为高效。不能代理final类和final方法。四、JDK 动态代理与 CGLIB 的比较特性JDK 动态代理CGLIB 动态代理代理方式基于接口实现基于继承实现是否要求接口必须有接口不要求目标类有接口代理对象类型代理类实现目标接口代理类是目标类的子类性能较差使用反射相对较好使用字节码生成代理目标对象类型只能代理接口的实现类可以代理任何类代理限制无法代理没有实现接口的类不能代理final类和方法五、Spring 框架中的使用在 Spring 中当使用 AOP 时框架会根据目标对象是否实现了接口来选择使用 JDK 动态代理还是 CGLIB 代理。如果目标类实现了接口Spring 会使用 JDK 动态代理如果目标类没有实现接口Spring 会自动使用 CGLIB 动态代理这时 Spring 会通过继承目标类并重写方法来生成代理对象。
Java开发者必看:SenseVoice-Small语音识别模型面试题与实战解析 Java开发者必看:SenseVoice-Small语音识别模型面试题与实战解析 最近和几个做Java后端的朋友聊天,发现大家除了关心Spring Cloud、Redis这些老本行,对怎么把AI能力,特别是像语音识别这种实用功能,接到自己的系统里越来… 2026/7/6 12:25:23
智能轻量防休眠工具:NoSleep让Windows系统时刻保持清醒 智能轻量防休眠工具:NoSleep让Windows系统时刻保持清醒 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 当系统自动进入休眠时,真正中断的是什么&#x… 2026/7/6 10:28:25
Cowabunga Lite使用指南:开源工具实现iOS个性化定制的4个实用技巧 Cowabunga Lite使用指南:开源工具实现iOS个性化定制的4个实用技巧 【免费下载链接】CowabungaLite iOS 15 Customization Toolbox 项目地址: https://gitcode.com/gh_mirrors/co/CowabungaLite Cowabunga Lite是一款针对iOS 15系统的开源个性化定制工具&… 2026/7/7 1:15:29
鸿蒙原生 ArkTS 弹窗布局深度解析:AlertDialog 与 CustomDialog 全场景对比实战 鸿蒙原生 ArkTS 弹窗布局深度解析:AlertDialog 与 CustomDialog 全场景对比实战一、引言 弹窗是移动端最高频的交互组件之一。在鸿蒙 ArkTS 体系中,开发者拥有两种核心方案:AlertDialog(系统级弹窗)与 CustomDialog&am… 2026/7/8 14:38:15
Next.js DApp 国际化路由:多语言链上术语库与动态内容切换 Next.js DApp 国际化路由:多语言链上术语库与动态内容切换 一、链上术语的一致性问题:当"滑点"不是 Slippage 时 DApp 的多语言支持比传统 Web 应用多了一层复杂性:链上术语在不同语言中的标准化程度差异巨大。在中文社区ÿ… 2026/7/8 14:36:14
GLM 5.2:开源模型正在杀死AI推理的暴利时代 7月6日,一篇名为《GLM 5.2 and the coming AI margin collapse》的文章在Hacker News上引发热议,斩获103个赞。文章作者Martin Alderson直言:GLM 5.2是他见过的第一个"真正能与Opus和GPT在智能体任务上竞争的开放权重模型"… 2026/7/8 14:32:08
一站式解决跨境电商需求的批量图片翻译与智能抠图神器 问题引入随着跨境电商行业的快速发展,越来越多的卖家开始面临多语言市场的挑战。亚马逊卖家在上架新品时,常常遇到以下问题:图片翻译繁琐:需要将商品图片中的文字翻译成多种语言,手动处理耗时且容易出错。 视频字幕制作… 2026/7/8 14:32:08
15岁少年用AI掀翻万代频道:真正可怕的不是黑客,是门槛被打穿了 一、别把它当成“少年黑客故事”,这是一记系统耳光当AI把“不会写代码”这道门槛拆掉之后,很多平台才发现,自己所谓的安全体系,薄得像一层纸。 热闻岛报道,日本警方破获一起针对万代南梦宫旗下动画串流平台“万代频道”… 2026/7/8 14:30:08
看看最最近7天死机或重启的统计,找找原因 @WorkBuddy 7 天死机统计 — HP Z620 已进入不可用状态 崩溃事件汇总 日期0x124 蓝屏硬关机/冻结当日备注6/3000WHEA 内存错误集中爆发 8 次7/12022:28、22:42 各一次7/21106:28 蓝屏 19:13 硬关机7/302系统冻结(无 dump)7/450凌晨 下午各一波7/52003:28、06:32… 2026/7/8 14:26:06
BetterNCM安装器:高效管理网易云插件的最佳选择 BetterNCM安装器:高效管理网易云插件的最佳选择 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 还在为网易云音乐插件的繁琐安装流程而烦恼吗?BetterNCM安装器是… 2026/7/8 0:02:48
运动控制系统安全设置对比:ECI3808的3种限位保护与急停逻辑实现 运动控制系统安全机制深度解析:限位保护与急停逻辑的设计哲学在精密制造与自动化领域,运动控制系统的安全设计绝非简单的功能堆砌,而是一套融合了机械工程、电气原理和软件算法的防御体系。当一台数控机床以每分钟数万转的速度运转࿰… 2026/7/8 0:06:48
AI大模型应用开发:小白也能抓住的红利风口,收藏这篇入门指南! 文章指出,虽然微软等科技巨头在裁员,但英伟达等公司却在积极扩招AI相关人才,尤其是具身智能、仿真等领域。AI行业正在经历结构性调整,传统岗位被淘汰,而大模型应用开发等新岗位需求旺盛。对于想转行或学习AI的普通人来… 2026/7/8 0:10:49
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/7 11:26:57
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08