当前位置: 首页 > 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. 实现方法调用拦截和功能增强

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

相关文章:

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

应友友的要求&#xff0c;本章是对于Java的CGLIB动态代理进行一个通俗的解释&#xff0c;希望能够帮助到奋斗的你&#xff0c;一起加油&#xff01;&#xff01;&#xff01; &#x1f31f; 通俗理解CGLIB动态代理 想象你有一个玩具机器人&#xff08;原始类&#xff09;&…...

Python3 基础语法

编码 默认情况下&#xff0c;Python3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*- 上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&#xff0c;对应适合…...

基于Lucene的多场景检索系统开发指南

基于Lucene的多场景检索系统开发指南 官网 https://lucene.apache.org/ 一、项目构建配置 (pom.xml) <dependencies><!-- Lucene核心库 --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId&g…...

SDC命令详解:使用get_nets命令进行查询

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 get_nets命令用于创建一个线网对象集合&#xff0c;关于设计对象和集合的更详细介绍&#xff0c;可以参考下面的博客。需要注意的是&#xff0c;在有些工具中还存…...

MATLAB长方体磁体3D磁力线生成

代码说明&#xff1a; 磁体参数设置&#xff1a;对磁体的尺寸、磁化强度以及真空磁导率进行定义。计算网格生成&#xff1a;构建一个 3D 网格&#xff0c;同时排除磁体内部的点。磁场计算&#xff1a;采用等效面磁荷法来计算每个网格点的磁场。可视化&#xff1a; 绘制磁体的框…...

东土科技NewPre系列智能控制器的创新之旅

物流行业&#xff0c;作为支撑现代供应链的核心环节&#xff0c;正在面临效率瓶颈、人工成本上升、设备协同难等多重挑战。如何实现从自动化向智能化的转型&#xff0c;成为行业亟须解决的关键问题。东土科技基于NewPre3102智能控制器打造的工业AI智能机器人控制系统&#xff0…...

2025年燃气从业人员考试题库及答案

一、单选题 83.城镇燃气输配管道严密性试验稳压的持续时间应为24h&#xff0c;每小时记录不应少于1次&#xff0c;当修正压力降小于_____Pa为合格。&#xff08;&#xff09; A.100 B.133 C.150 D.200 答案&#xff1a;B 84.室外钢管敷设描述错误的是_____。&#xff08;…...

小结: 接口类型和路由优先级

网络接口类型 1. Bridge-if&#xff08;桥接接口&#xff09; 作用&#xff1a;用于桥接网络&#xff0c;将多个接口或VLAN连接为一个广播域&#xff0c;实现二层数据转发。 常用指令&#xff1a; interface bridge-if <number> bridge <bridge-id> # 将接口加入…...

【XR空间传送】深入理解Unity中 XR Interaction Toolkit 的 MatchOrientation 用法与使用场景(空间传送、视角切换)

一、前言 在 Unity 进行 VR/AR 开发&#xff0c;尤其是在展示、环境体验、导览交互等场景中&#xff0c;“传送&#xff08;Teleport&#xff09;”是一项非常核心的操作。它不仅决定了玩家的位置&#xff0c;还直接影响玩家的站姿、视角与空间感知。 在 Unity 官方提供的 XR…...

PPT/WORD如何实现Shift键加鼠标滚轮实现左右滑动

方法&#xff1a;使用【AutoHotKey】软件 1. 什么是AutoHotKey&#xff1f; AutoHotKey (AHK)&#xff0c;是一款类似于按键精灵的软件&#xff0c;用于自动化控制键盘和鼠标&#xff0c;提高工作效率。 官网下载&#xff1a;https://www.autohotkey.com/ 2. 需求背景 在编…...

C++函数模板基础

1 函数模板 1.1 基础介绍 函数模板是一种特殊的函数定义,它允许你创建通用的函数,这些函数可以处理多种不同的数据类型,而不需要为每种数据类型都编写一个单独的函数。 在 C++ 里,函数模板的格式包含模板声明与函数定义两部分,其基本格式如下: template <typename…...

Java实现使用EasyExcel按模板导出文件

需求&#xff1a;导出excel文件要求头部标题内容过于复杂&#xff0c;在代码层面不好实现&#xff0c;直接提供模板&#xff0c;只需要将数据写入即可。 一、代码实现示例 实现数据写入模板代码如下&#xff1a; public void export(HttpServletResponse response) throws E…...

【AI】OrinNX上安装RIVA-2.19.0,实现文本转语音

1、注册NGC账户 1)登录官网注册, https://ngc.nvidia.com/signin 2)生成key 3)拷贝生成的key到文本中,下面会使用 2、安装NGC工具 目前最新版本为3.64.2 1)下载 wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/vers…...

Ansible安装配置

一、前提 服务器操作系统均为centos7.9 主机ipmaster(Ansible管理端)172.25.192.2node1172.25.192.10node2172.25.192.3 更新/etc/hosts文件 二、安装 master节点&#xff1a; 1. 安装epel源 yum install -y epel-release 2. 安装Ansible yum install -y ansible A…...

认识Linux基本操作、命令

目录 一、了解一下用户目录、linux根目录 二、常见的linux命令 &#xff08;1&#xff09;目录切换 cd【与windows通用】 &#xff08;2&#xff09; 查看文件列 ls &#xff08;3&#xff09;打开文件权限-chmod ux *.sh &#xff08;4&#xff09;查看当前所在路径 pwd…...

Android学习总结之Bitmap篇

一、质量压缩&#xff08;面试高频&#xff1a;原理与适用场景&#xff09; 1. 核心原理&#xff08;面试官必问&#xff09; 质量压缩针对有损压缩格式&#xff08;如 JPEG&#xff09;&#xff0c;通过丢弃图像中人类视觉不敏感的高频信息&#xff08;如色彩过渡细节&#…...

MySQL--数据引擎详解

存储引擎 MySQL体系结构 连接层&#xff1a; 主要接收客户端的连接&#xff0c;然后完成一些链接的处理&#xff0c;以及认证授权的相关操作和安全方案&#xff0c;还要去检查是否超过最大连接数等等&#xff0c;比如在连接MySQL服务器时需要输入用户名&#xff0c;密码&#…...

高瓴资本张磊的顶级价值投资之道

高瓴资本张磊的顶级价值投资之道 一、核心理念&#xff1a;长期主义与动态价值创造 张磊的价值投资体系以“长期主义”为基石&#xff0c;结合中国产业升级特点&#xff0c;形成了独特的投资哲学&#xff1a; 时间维度重构 • 主张跨越经济周期&#xff0c;关注企业10年以上的价…...

JAVA使用Apache POI导出Word,支持向表格动态添加多行数据

JAVA使用Apache POI动态导出Word文档_java导出word文档-CSDN博客...

外部存储器接口:EMIF总线

作为嵌入式系统中的关键接口之一&#xff0c;EMIF&#xff08;External Memory Interface&#xff0c;外部存储器接口&#xff09; 是处理器与外部存储器或外设进行高速数据交换的核心总线。以下从工作原理、信号定义、配置方式到设计要点进行系统化解析&#xff1a; 一、EMIF的…...

四.割草机技术总结--4.基站发送给流动站的差分数据传输标准RTCM

四.割草机技术总结–4.基站发送给流动站的差分数据传输标准RTCM 文章目录 四.割草机技术总结--4.基站发送给流动站的差分数据传输标准RTCM4.0 RTCM差分标准4.1 **什么是RTCM?**4.1.1**>版本1**4.1.2**>版本2**4.1.3**>版本3**4.2**为什么RTK的固件升级很重要?**4.3参…...

openssl_error_string() 不要依赖错误信息作为逻辑判断

不应该将 OpenSSL 错误信息直接用于程序的逻辑控制&#xff0c;而是应该将其作为调试和记录的辅助手段。这是因为 OpenSSL 错误信息的格式和内容可能会因 OpenSSL 版本、操作系统环境等因素而发生变化&#xff0c;直接依赖这些信息可能会导致代码的不稳定和难以维护。 为什么不…...

AbortController 取消请求

‌AbortController‌是JavaScript中的一个全局类&#xff0c;主要用于中止各种异步操作&#xff0c;包括网络请求、事件监听器、可写流和数据库事务等。通过提供一个AbortSignal对象&#xff0c;AbortController允许开发者在需要时自由地终止这些操作&#xff0c;避免不必要的开…...

【论文阅读】PEEKABOO: Interactive Video Generation via Masked-Diffusion

PEEKABOO: Interactive Video Generation via Masked-Diffusion 原文摘要 研究背景与问题 现状&#xff1a;现代视频生成模型&#xff08;如 Sora&#xff09;已能生成高质量视频&#xff0c;但缺乏用户交互控制能力。 问题&#xff1a;交互控制是未来应用和创意表达的关键功能…...

Java 多线程基础:Thread 类详解

在 Java 中&#xff0c;多线程编程离不开 Thread 类。本文将介绍 Thread 的常用属性和方法&#xff0c;并结合实际使用场景进行讲解。 一、线程的创建与基本操作 Java 提供了两种主要方式来创建线程&#xff1a; 继承 Thread 类 class MyThread extends Thread {public void r…...

论文阅读:2024 arxiv FlipAttack: Jailbreak LLMs via Flipping

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://www.doubao.com/chat/4001481281518594 FlipAttack: Jailbreak LLMs via Flipping https://arxiv.org/pdf/2410.02832 速览 这篇论文主要介绍了一种针对大语言模…...

《数据结构之美--二叉树oj题练习》

引言&#xff1a; 上次我们学习了二叉树这一数据结构&#xff0c;这次我们就针对二叉树来做一些oj题来巩固一下 1. 单值二叉树 题目&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; 题目传送门: 力扣–965.单值二叉树 2. 相同的树 题目&#xff1a; 思路分析&am…...

大模型——使用coze搭建基于DeepSeek大模型的智能体实现智能客服问答

大模型——使用coze搭建基于DeepSeek大模型的智能体实现智能客服问答 本章实验完全依托于coze在线平台,不需要本地部署任何应用。 实验介绍 1.coze介绍 扣子(coze)是新一代 AI 应用开发平台。无论你是否有编程基础,都可以在扣子上快速搭建基于大模型的各类 AI 应用,并…...

React Navigation 使用指南

React Navigation 使用指南 React Navigation 介绍 React Navigation 是 React Native 中推荐的路由管理方案。 1. 开箱即用&#xff0c;快速上手&#xff08;Easy to Use&#xff09; 提供 内置导航器&#xff08;Built-in Navigators&#xff09;&#xff0c;如栈导航&…...

双系统,bios默认设置启动ubuntu+ubuntu改启动grub设置

设置默认启动ubuntu 装windows后就默认启动windows了 按f6上移动 -------------底下不用看 设了没用 sudo update-grub...

Vue 中的过渡效果与响应式数据:transition、transitiongroup、reactive 和 ref 详解

在 Vue 开发过程中&#xff0c;为应用添加过渡效果和处理响应式数据是提升用户体验和实现动态交互的关键。 一、transition&#xff1a;元素的单元素过渡效果 transition是 Vue 提供的内置组件&#xff0c;专门用于为单个元素或组件添加过渡动画。它会在元素插入、更新或移除…...

Gitea windows服务注册,服务启动、停止、重启脚本

修改配置文件 查看COMPUTERNAME echo %COMPUTERNAME%进入配置文件D:\gitea\custom\conf\app.ini&#xff0c;将 Gitea 设置为以本地系统用户运行 如果结果是 USER-PC&#xff0c;那么 RUN_USER USER-PC$ RUN_USER COMPUTERNAME$SQLite3 PATH配置&#xff0c;更改为包含完整…...

SpringBoot、微服务与AI场景题深度解析

SpringBoot、微服务与AI场景题深度解析 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于SpringBoot、微服务以及AI技术的应用场景和解决方案。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&#xff1a;马架构&#xff0c;欢迎来到我…...

实验六 文件操作实验

一、实验目的 1、了解文件系统功能及实现原理。 2、掌握LINUX下文件操作的有关系统调用。 3、熟悉main函数带参数运行的有关操作过程。 4、通过模拟程序实现简单的一级文件系统或二级文件系统。 二、实验内容 1、编程显示文件自身。&#xff08;1分&#xff09; #includ…...

scratch代码——游戏开发 【弹簧与反弹】

添加角色——绘制 1&#xff0c;level 平台 2&#xff0c; ball 球 3&#xff0c;terk 坦克 开始编程——ball 函数 其余代码 开始编程——terk 代码 完结撒花 ——————————————————THE—END————————————————————...

C++入门(缺省参数/函数/引用)

C入门 一.前言二.缺省参数什么是缺省参数&#xff1f; 三.函数重载一.传参类型不同2. 传参个数不同3.传参顺序不同注意点 四.引用1.引⽤的概念和定义2.引⽤的特性3.引⽤的使⽤4. const引⽤5.指针和引⽤的关系 五.inline&#xff08;内联&#xff09;一、什么是inline函数&#…...

ACTF2025 - WEB Excellent-Site

#flask框架 #互联网 #利用CRLF进行头控制 #通过CRLF注入伪造 #利用sql注入进行回显控制 #Jinja2模板 #注意sql语句的相关转义可以控制查询结果 [[IMAP协议简介]] [[SMTP协议简介]] app.py import smtplib import imaplib import email import sqlite3 from urllib.pa…...

通过 Node.js 搭配 Nodemailer 实现邮箱验证码发送

目录 一、整体思路 二、环境准备 三、代码详细步骤 1. 引入模块并初始化 2. 配置 Nodemailer 邮件服务 3. 定义发送验证码接口 4. 定义校验验证码接口 5. 启动服务器 四、补充说明 一、整体思路 接收邮箱地址请求 → 用户在前端填写邮箱&#xff0c;发送到后端接口&…...

Java后端程序员学习前端之html

什么是html Hyper Text Markup Language(超文本标记语言) 超文本包括:文字、图片、音频、视频、动画等 组织&#xff1a;W3C World Wide Web Consortium(万维网联盟)。 成立子1994年&#xff0c;Web技术领域最权威和具影响力的国际中立性技术标准机构 http://www.w3.org! …...

[密码学实战]SDF之非对称运算类函数(三)

[密码学实战]SDF之非对称运算类函数(三) 一、标准解读:GM/T 0018-2023核心要求 1.1 SDF接口定位 安全边界:硬件密码设备与应用系统间的标准交互层 功能范畴: #mermaid-svg-4fs0ed6OYQs5fXlc {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:…...

MCP 架构全解析:Host、Client 与 Server 的协同机制

目录 &#x1f3d7;️ MCP 架构全解析&#xff1a;Host、Client 与 Server 的协同机制 &#x1f4cc; 引言 &#x1f9e9; 核心架构组件 1. Host&#xff08;主机&#xff09; 2. Client&#xff08;客户端&#xff09; 3. Server&#xff08;服务器&#xff09; &#…...

第三部分:赋予网页灵魂 —— JavaScript(下)

目录 7 DOM 操作&#xff1a;控制网页的"智能面板7.1 小例子&#xff1a;点击按钮时改变段落文字&#xff0c;根据用户输入改变图片7.2 练习&#xff1a;实现一个简单的 Tab 切换效果 8 事件处理&#xff1a;响应用户的"指令"8.1 小例子&#xff1a;实现点击按钮…...

(02)Redis 的订阅发布Pub/Sub

我们为了自己实现一个MQ功能&#xff0c;就要深入底层挖掘现有开源产品的实现过程。 Redis 发布订阅底层结构解析 Redis 不存储消息&#xff0c;仅作为“实时中转”&#xff1b;只有订阅者在线时才能收到消息&#xff1b;消息是广播给所有订阅此频道的客户端。 1. 核心数据结…...

JavaScript性能优化实战:从基础到高级的全面指南

作为前端开发者&#xff0c;掌握JavaScript性能优化是提升用户体验和职业竞争力的关键。本文将系统性地介绍JavaScript性能优化的各个方面&#xff0c;从基础概念到高级技巧&#xff0c;帮助你编写更高效的代码。 一、JavaScript性能优化基础概念 1.1 什么是JavaScript性能优…...

CertiK创始人顾荣辉出席Unchained Summit,探讨Web3.0安全与合规路径

4月28日&#xff0c;CertiK联合创始人、哥伦比亚大学教授顾荣辉出席迪拜Unchained Summit峰会并发表主题演讲&#xff0c;探讨Web3.0在创新与安全间的平衡&#xff0c;引发网易科技、中国财经时报、腾讯网、新浪财经等多家知名媒体的关注和报道。 作为迪拜最重要的峰会之一&am…...

企业出海降本:如何将应用从 AWS EC2 快速无缝迁移至DigitalOcean Droplet

企业出海已经成为目前最热门的趋势。然而不论你是做跨境电商&#xff0c;还是短剧出海&#xff0c;或处于最热门的AI 赛道&#xff0c;你都需要使用海外的云主机或GPU云服务。海外一线的云服务平台尽管覆盖区域广泛&#xff0c;但是往往费用成本较高。所以降本始终是企业出海关…...

java练习2

package a01_第一次练习.a02_计算输入天数;import java.text.ParseException; import java.time.Duration; import java.time.LocalDateTime; import java.util.Scanner;public class Test {public static void main(String[] args) throws ParseException {//当前时间LocalDat…...

PDM是什么?PDM有什么用?怎么选PDM?2025制造PDM/PLM系统盘点(4000字)

&#xff08;文章来自CRDE PDM研究中心&#xff09; 摘要 PDM是制造企业产品数据管理的核心工具&#xff0c;并逐渐发展出了PLM、云PLM等新形态&#xff0c;在功能增加的同时成本也有大幅降低&#xff0c;已经成为企业研发管理的最优选择&#xff0c;并逐渐被有产品创新需求的…...

TiDB 可观测性最佳实践

TiDB 介绍 TiDB&#xff0c;由 PingCAP 公司自主研发的开源分布式关系型数据库&#xff0c;是一款创新的 HTAP 数据库产品&#xff0c;它融合了在线事务处理&#xff08;OLTP&#xff09;和在线分析处理&#xff08;OLAP&#xff09;的能力&#xff0c;支持水平扩容和缩容&…...

8.idea创建maven项目(使用Log4j日志记录框架+Log4j 介绍)

8.idea创建maven项目(使用Log4j日志记录框架Log4j 介绍) 在 IntelliJ IDEA 的 Maven 项目中引入了 Log4j&#xff0c;并配置了日志同时输出到控制台和文件。 Log4j 提供了灵活的日志配置选项&#xff0c;可以根据项目需求调整日志级别、输出目标和格式。 1. 创建 Maven 项目 …...