阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

动态代理

377次阅读
没有评论

共计 2458 个字符,预计需要花费 7 分钟才能阅读完成。

1、动态代理概述

代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。
举例:春季回家买票让人代买,租房找中介
动态代理:在程序运行过程中产生的这个对象
如何让程序在运行过程中帮我们动态地产生这个对象呢?可以通过 Java 的反射实现。

为什么要用动态代理

​ 动态代理的目的是在不更改原有对象(目标对象)的基础上实现功能代码的 增强

2、动态代理的种类

(1) JDK 动态代理

(2)CGLIB 动态代理

3、JDK 动态代理

3.1、概述

JDK 的动态代理是 JDK 自带的动态代理技术,所以使用 JDK 动态代理的时候不需要额外引入第三方的 jar 包!

JDK 动态代理是对 对象 本身进行 代理 的一种技术!他是通过 java.lang.reflect 包下提供的一个 Proxy 类的 newProxyInstance 方法 和一个 I nvocationHandler接口来实现动态代理对象的!

但 JDK 提供的代理 只能针对实现接口 的对象做代理!如果要对没有接口实现的类做代理的话就要用 cglib 了。

3.2、实现步骤

需求:给钢铁侠添加火箭助推器

1、创建接口(火箭助推器接口)

public interface Rocket {public void takeOff(); }

2、创建目标对象钢铁侠并实现火箭助推器接口

public class IronMan implements Rocket {@Override public void takeOff() {System.out.println("i can fly!!!"); } }

3、创建动态代理启用控制类,该类功能是对方法功能进行增强,该类实现 InvocationHandler 接口

class MyInvocationHandler implements InvocationHandler{// 目标对象 Object obj; public MyInvocationHandler(Object obj) {super(); this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("火箭助推器被增强了");// 增强的功能代码 Object rst = method.invoke(obj, args);// 执行目标对象方法 return rst; } }

4、创建目标对象,并通过 Proxy 代理类的 newProxyInstance 方法为其生成代理对象

public static void main(String[] args) {IronMan ir = new IronMan();// 创建目标对象 InvocationHandler h = new MyInvocationHandler(ir);// 将目标对象传入控制器中等待被代理 // 生成代理对象 Rocket proxy = (Rocket) Proxy.newProxyInstance(ir.getClass().getClassLoader(), ir.getClass().getInterfaces(), h); proxy.takeOff();}

4、CGLIB 动态代理

4.1、概述

cglib:code generator library, 代码生成库,他可以动态的生成字节码对象,可以凭空创建一个字节码对象。

4.2、CGLIB 原理

jdk 代理是对类的对象进行代理,而 CGLIB 代理是通过创建一个目标对象的子类的形式进行代理,也就是 CGLIB 在类的字节码阶段,就已经把增强的代码织入进去了,之后再用增强的字节码对象创建该类的子类对象,从而实现了动态代理,达到代码增强的目的!

所需 Jar 包

  • asm-2.2.3.jar
  • asm-commons-2.2.3.jar
  • asm-util-2.2.3.jar
  • cglib-nodep-2.1_3.jar

4.3、CGLIB 动态代理实现步骤

1、生成一个字节码对象 —-> 该对象就是 CGLIB 凭空造出的字节码对象

2、设置字节码对象的父类 —> 该父类就是要增强的目标对象

3、通过生成的子类去增程父类方方法—> 在重写的过程中调用父类的原方法(回调)

4、通过这个生成的字节码对象创建增强对象 –> 再去调用方法,该方法就被增强了

动态代理

4.4、CGLIB 代码增强演示

1、导包

动态代理

2、创建目标对象(无序实现接口)

// 目标对象(要增强的类) public class SuperMan {public void fly(){System.out.println("i can fly!!!"); } }

3、创建用于回调增强的方法类

public class MyCallback implements MethodInterceptor {/* * target: 目标对象 * method: 目标对象中的方法 * args: 方法的实参列表 * met: 代理对象中的方法(子类中的方法)* * */ @Override public Object intercept(Object target, Method method, Object[] args, MethodProxy met) throws Throwable {System.out.println("火箭助推器"); return met.invokeSuper(target, args);// 子类中的方法执行 } }

4、创建子类字节码对象,设置回调,实现增强

public static void main(String[] args) {Enhancer en = new Enhancer();// 凭空创建字节码对象 en.setSuperclass(SuperMan.class);// 设置该字节码对象的父类是 SuperMan Callback cb = new MyCallback();// 创建用于增强的回调对象 en.setCallback(cb);// 设置子类字节码对象的回调方法 SuperMan sm = (SuperMan) en.create();// 创建代理对象 sm.fly();// 调用代理对象中代理的方法,该方法以被增强 }

运行结果

动态代理

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计2458字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7819807
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
开源神器组合!1Panel面板+Halo助你轻松打造个人/企业内容中心

开源神器组合!1Panel面板+Halo助你轻松打造个人/企业内容中心

开源神器组合!1Panel 面板 +Halo 助你轻松打造个人 / 企业内容中心 前言 大家好,我是星哥,之前...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...