代理模式--cglib动态代理

1.介绍

cglib (Code Generation Library ) 是一个第三方代码生成类库,运行时在内存中动态生成一个子类对象从而实现对目标对象功能的扩展。cglib 为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。

2.JDK动态代理与CGLIB动态代理对比
  • JDK动态代理

    • 只能代理实现了接口的类。
    • 基于接口的代理,通过反射机制来实现,在运行时创建接口的匿名类。
    • 代码简洁,原生支持Java。
  • CGLIB动态代理

    • 可以代理没有实现接口的类。
    • 基于继承的代理,通过生成目标类的子类来实现代理。
    • 性能更高,但生成的代理类可能比较复杂。
3. CGLIB的使用场景
  • 代理类的生成原理

    • CGLIB通过修改字节码生成目标类的子类来实现代理,利用了ASM(一个Java字节码操作框架)来动态生成新的类。
  • 实现原理示例

    • 展示如何使用CGLIB生成一个简单的代理类,并解释其生成的字节码结构。
4. 代码示例
  • 演示如何使用CGLIB创建代理对象
    • 创建一个普通的Java类,然后使用CGLIB生成它的代理对象,并调用代理对象的方法
public class TargetClass {public void doSomething() {System.out.println("Target method doing something.");}
}public class ProxyInterceptor implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {System.out.println("Before invoking method: " + method.getName());Object result = proxy.invokeSuper(obj, args);System.out.println("After invoking method: " + method.getName());return result;}
}public class CglibDynamicProxyExample {public static void main(String[] args) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(TargetClass.class);enhancer.setCallback(new ProxyInterceptor());TargetClass proxy = (TargetClass) enhancer.create();proxy.doSomething();}
}

  • 示例解析
    • TargetClass 是被代理的普通类。
    • ProxyInterceptor 实现了 CGLIB 的 MethodInterceptor 接口,定义了代理对象的行为,在方法调用前后可以执行自定义的逻辑。
    • CglibDynamicProxyExample 中使用 Enhancer 类创建代理对象,并指定代理对象的超类(即被代理类),以及使用的拦截器。
5. 总结
  • 优缺点对比
    • CGLIB动态代理性能更高,支持代理非接口类,但生成的代理类可能复杂。
    • JDK动态代理简单易用,只能代理接口,生成的代理类结构简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全学习】漏洞扫描:-04- ZAP漏洞扫描工具

**ZAP(Zed Attack Proxy)**是一款由OWASP组织开发的免费且开源的安全测试工具。 ZAP支持认证、AJAX爬取、自动化扫描、强制浏览和动态SSL证书等功能。 1️⃣ 安装zap工具 现在的kali版本不一定会预装zap,我们可以自行安装,安装也十分简单。 apt-get …

下载nvm安装完成后使用命令无法连接网络的解决办法(环境变量中设置全局IP网络代理)

在cmd中输入 nvm ls available , 可以查看node.js的可用的版本号 但是半天没动静,然后显示连接超时: Could not retrieve https://nodejs.org/dist/index.json.Get "https://nodejs.org/dist/index.json": dial tcp 104.20.23.46:…

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

30.Netty进阶-黏包半包解决方案-短链接

客户端发送一次完整的消息,然后就把与服务端的链接断开。服务端读到的结果就是-1。 服务器就知道 从链接建立到断开,发送的数据是一条完整的数据。 客户端代码 package com.xkj.nian;import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.net…

转让中字头无区域农业公司变更快包迁全国

国家局名称的公司不仅可以提升企业形象,还能展现公司的实力。由于国家总局核名的审核标准相对严格,能够通过核名的企业一般都具备一定的实力和资质。因此,选择国家局核名的企业往往能够在市场中获得更多信任和认可。详情致电咨询我或者来公司…

C# 实现draw一个简单的温度计

运行结果 概述: 代码分析 该控件主要包含以下几个部分: 属性定义: MinValue:最低温度值。 MaxValue:最高温度值。 CurrentValue:当前温度值。 构造函数: 设置了一些控件样式来提升绘制效果…

Flutter showModalBottomSheet用法

先搞一个DialogUtil工具类 import package:flutter/material.dart;class DialogUtil {static void showCommonBottomSheet(BuildContext context,Widget widget,{scrollControlledfalse}){showModalBottomSheet(context: context,enableDrag:false,builder: (BuildContext con…

【计算机网络体系结构】计算机网络体系结构实验-DHCP实验

服务器ip地址 2. 服务器地址池 3. 客户端ip 4. ping Ipconfig

sed的介绍及应用

sed 文本三剑客之一 sed是一种流编辑器,一次处理一行内行。 如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。 工作模式:一行一行处理,处理完当前…

PyTorch(二)张量

#c 总结 张量总结 该文档主要熟悉了「张量」的概念,理解了「张量」在深度学习中扮演的重要角色,如何判断代码中哪些属于张量。其次熟悉了张量的「四种初始化」,以及「张量属性」,「张量操作」 1 张量概念 #d 张量 「张量&…

解决Visual Studio Code在Ubuntu上崩溃的问题

解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统,每次打开Visual Studio Code时,只能短暂打开一秒钟,然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时,出现以下错误信息:…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验7 虚拟局域网VLAN

一、实验目的 1.学习如何划分VLAN; 2.验证划分VLAN的作用; 3.学习如何用命令行创建VLAN,将端口划分到VLAN,设置端口类型。 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频&am…

mysql、pg的sql请求处理流程

mysql的sql请求处理流程 连接器 客户端发起 SQL 查询请求时,首先会经过连接器模块。连接器模块负责管理客户端与服务器端之间的 TCP/IP 连接。它会验证用户身份,如果认证通过,就建立连接并分配相应的线程资源。 授权器 连接成功后,授权器模块会根据用户权限,检查当前用户是…

cmake和Make的安装及配置

cmake和Make的安装及配置 安装 make 工具的步骤取决于你使用的操作系统。以下是不同操作系统上安装 make 工具的指南: 在 Linux 上安装 make 对于大多数 Linux 发行版,可以使用包管理器来安装 make。以下是一些常见的 Linux 发行版的安装命令: Ubuntu/Debian sh 复制代码…

3d中模型显示黑色给不了材质---模大狮模型网

如果3D模型显示黑色,而且无法给它添加材质,可能有以下几种原因: 一:模型没有UV贴图 UV贴图是3D模型表面纹理的一种方式,如果模型没有正确的UV贴图,渲染时可能会显示黑色。在大多数3D建模软件中&#xff0c…

Docker常见面试题整理

文章目录 1. Docker 是什么?它解决了什么问题?2. Docker 和虚拟机(VM)的区别是什么?3、Docker三个核心概念4、如何构建一个 Docker 镜像?5、如何将一个 Docker 容器连接到多个网络?6、Docker Co…

Flink nc -l -p 监听端口测试

1、9999端口未占用 netstat -apn|grep 99992、消息发送端 nc -l -k -p 9999 {"user":"ming","url":"www.baidu1.com", "timestamp":1200L, "score":1} {"user":"xiaohu","url":…

GIT 合拼

合拼有多种方式: 1)合拼分支: git merge [source-branch] 2)合拼提交 : git cherry-pick [commit-hash] 3)合拼单个文件: git checkout [source-branch] – [file] 以上合拼,比如将分…

qml:一个基础的界面设计

文章目录 1、文章说明2、效果图3、重要代码说明3.1 组件切换开关下拉框矩形卡片 3.2 窗口最大化后组件全部居中3.3 菜单栏3.4 Repeater实现重复8行3.5 图片加载直接加载图片文本转图片FluentUI中可供选择的图标 1、文章说明 qt6.5.3 qml写的一个界面配置设计软件,目…

docker in docker 连私有仓库时报错 https

背景 jenkins 是使用 docker 方式部署的, 在 jenkins中又配置了 docker 的命令, 使用的宿主机的 docker 环境, 在jenkins 中执行 docker 相关命令的时候报错 jenkinse0e7b943b6e4:/$ docker login -u admin -p Harbor12345 172.16.100.15:80 WARNING! Using --password via t…