当前位置: 首页 > news >正文

【Java学习】Java的CGLIB动态代理:通俗解释与使用指南

应友友的要求,本章是对于Java的CGLIB动态代理进行一个通俗的解释,希望能够帮助到奋斗的你,一起加油!!!

🌟 通俗理解CGLIB动态代理

想象你有一个玩具机器人(原始类),现在你想给它增加新功能但又不想拆开它改造。CGLIB就像是一个"魔法复制机":

  1. 复制并增强:它复制你的机器人,在新机器人里加入额外功能(如发光、说话)
  2. 保持原样:原来的机器人完全没被改动
  3. 随时调用:当你使用这个"增强版机器人"时,它会先执行新功能,再执行原来的功能

🆚 和JDK动态代理的区别

  • JDK代理:需要机器人有"说明书"(接口),按照说明书复制
  • CGLIB代理:直接复制机器人本身,不需要说明书

🔧 使用CGLIB的步骤

1. 添加CGLIB依赖(Maven项目)

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.3.0</version>
</dependency>

2. 准备一个普通类(没有接口也行)

class Cat {public void eat() {System.out.println("小猫吃鱼");}public final void sleep() {  // final方法不能被代理System.out.println("小猫睡觉");}
}

3. 创建代理

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibDemo {public static void main(String[] args) {// 1. 创建增强器Enhancer enhancer = new Enhancer();// 2. 设置父类(要代理的类)enhancer.setSuperclass(Cat.class);// 3. 设置回调(相当于JDK代理的InvocationHandler)enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("--- 喂食前洗手 ---");  // 前置增强Object result = proxy.invokeSuper(obj, args);  // 调用原方法System.out.println("--- 清理猫碗 ---");    // 后置增强return result;}});// 4. 创建代理对象Cat proxyCat = (Cat) enhancer.create();// 5. 使用代理对象proxyCat.eat();// 输出:// --- 喂食前洗手 ---// 小猫吃鱼// --- 清理猫碗 ---proxyCat.sleep();  // final方法不会被代理// 输出:小猫睡觉(没有增强效果)}
}

⚠️ 注意事项

  1. 不能代理final方法:就像你不能改造机器人的固定部件
  2. 目标类要有无参构造方法:复制机器需要原始蓝图
  3. 性能比JDK代理略高:但创建代理对象较慢

🌰 实际应用场景

  1. 在Spring AOP中,当目标类没有实现接口时
  2. 需要对普通类的方法进行监控、日志记录
  3. 实现方法调用拦截和功能增强

就像给你的原始机器人加上了"自动清洁"、"语音提醒"等功能,而原来的机器人完全不需要修改!

相关文章:

  • 短视频矩阵批量剪辑与场景剪辑功能 OEM 定制开发
  • deepseek_ai_ida_plugin开源插件,用于使用 DeepSeekAI 将函数反编译并重命名为人类可读的视图。该插件仅在 ida9 上进行了测试
  • 【开源项目】基于sherpa-onnx的实时语音识别系统 - LiveASR
  • 从Windows开发迁移到信创开发的指南:国产替代背景下的技术路径与实践
  • swagger2升级至openapi3的利器--swagger2openapi
  • 跨平台项目部署全攻略:Windows后端+Mac前端在服务器的协同实战
  • 基于Spring Boot+Vue 网上书城管理系统设计与实现(源码+文档+部署讲解)
  • jupyter已经安装但是无法通过命令行启动
  • AI编程工具“幻觉”风险与飞算JavaAl的破局之道
  • 万界星空科技QMS质量管理系统几大核心功能详解
  • Webug4.0通关笔记03- 第4关POST注入和第5关过滤注入
  • DeepSeek破界而来:重构大规模深度检索的算力与边界
  • GTC Taipei 2025 医疗域前瞻:从AI代理到主权生态,解码医疗健康与生命科学的未来图景
  • BT136-ASEMI无人机专用功率器件BT136
  • acwing背包问题求方案数
  • Android Studio中OpenCV应用详解:图像处理、颜色对比与OCR识别
  • 人体姿态估计常用数据集介绍
  • 32、Server.Transfer和Response.Redirect的区别是什么?
  • 5 个开源 MCP 服务器
  • 第三次作业(密码学)
  • 云南铁路:打造“铁路+金融+产业”融合发展生态
  • 人民日报:在大有可为的时代大有作为
  • 俄外长:俄将在不损害伙伴关系前提下发展对美关系
  • 交行一季度净利253.72亿元增1.54%,不良率微降
  • 成都世运会倒计时100天,中国代表团运动员规模将创新高
  • 当初没有珍惜巴特勒的热火,被横扫出局后才追悔莫及