
java之 动态代理
发布日期:2021-05-08 23:08:39
浏览次数:15
分类:博客文章
本文共 3293 字,大约阅读时间需要 10 分钟。
0x01 动态代理概述
这里先来讲一些动态代理的一个定义。
动态代理是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
(其实动态代理就是一个中间商,间接的把东西送到客户手里,但是在此之前肯定要赚点差价)
我们开发
中使用动态代理的主要目的是在不改变目标对象方法的情况下对方法进行增强
。
代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事,这个人就是代理者, 所以代理模式包含了3个角色: 被代理角色 代理角色 抽象角色(协议)
静态代理: 代理类是真实存在的,通过代理类产生代理对象
动态代理: 代理类是不真实存在的,在程序运行中,直接产生代理对象前提: 被代理类需要实现接口0x02、静态代理
public interface Happy { public abstract void happy();}public class JinLian { public void happy(){ System.out.println("金莲在happy..."); }}Public class WangPo implements Happy{ // 成员变量 JinLian jl; // 构造方法 public WangPo(JinLian jl) { this.jl = jl; } // 成员方法 @Override public void happy() { System.out.println("王婆以做衣服的名义开好房间,并把2人约到房间里..."); // 金莲happy jl.happy(); System.out.println("王婆打扫战场..."); }}
main:
public static void main(String[] args) { JinLian jl = new JinLian(); // happy // jl.happy(); // 请代理: 静态代理,代理类真实存在 Happy wp = new WangPo(jl);// wp:代理对象 WangPo类: 代理类 Happy接口: 协议 JinLian: 被代理类 wp.happy(); }
0x03、动态代理
动态代理概述:动态代理就是直接通过反射生成一个代理对象,代理对象所属的类是不需要存在的
Proxy.newProxyInstance(ClassLoader loader, Class [] interfaces, InvocationHandler h)生成一个代理对象 - 参数1:ClassLoader loader 被代理对象的类加载器 - 参数2:Class [] interfaces 被代理对象的要实现的接口 - 参数3:InvocationHandler h (接口)执行处理接口 - 返回值: 代理对象 - 前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方法,帮助我们调用方法InvocationHandler中的Object invoke(Object proxy, Method method, Object[] args)方法:调用代理类的任何方法,此方法都会执行 - 参数1:代理对象(慎用) - 参数2:当前执行的方法 - 参数3:当前执行的方法运行时传递过来的参数 - 返回值:当前方法执行的返回值
public static void main(String[] args) { /* 问题: 1.金莲不方便直接找西门happy 2.金莲的happy方法需要增强一下,例如:happy之前需要开房,happy之后需要打扫战场 静态代理: 代理类是真实存在的,通过代理类产生代理对象 动态代理: 代理类是不真实存在的,在程序运行中,直接产生代理对象 前提: 被代理类需要实现接口 动态代理实现获取代理对象: jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象 Proxy.newProxyInstance(ClassLoader loader, Class [] interfaces, InvocationHandler h)生成一个代理对象 参数1loader:被代理类的类加载器 参数2interfaces: 被代理类所有实现的接口的Class对象 参数3InvocationHandler: 执行处理类 前2个参数是为了帮助在jvm内部生成被代理类的代理对象,第3个参数用来监听代理对象调用的方法,帮助我们代理对象调用方法 */ // 使用动态代理直接产生金莲的代理对象 // 动态代理: 代理类是不真实存在的,但代理类是一定实现了被代理类的接口的 // p:动态代理产生的代理对象 代理类是不真实存在的 JinLian jl = new JinLian(); Happy p = (Happy) Proxy.newProxyInstance(JinLian.class.getClassLoader(), JinLian.class.getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 回调方法: 当代理对象调用了方法,就会来执行该invoke方法, 在该方法中就可以增强被代理类的方法 // 参数1: 生成的代理对象 这里就是p这个代理对象 (慎用) // 参数2: 当前代理对象执行的方法 这里method就是happy()方法对象 // 参数3: 当前代理对象执行的方法,传入的实际参数 // 返回值:当前代理对象执行的方法的返回值 // System.out.println("invoke"); // 王婆开房 System.out.println("王婆以做衣服的名义开好房间,把2人约到房间..."); // 金莲happy method.invoke(jl); // 王婆打扫 System.out.println("王婆打印战场..."); return null; } }); // 代理happy p.happy();// 无参数 }
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月02日 03时48分31秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unity平台 | 快速集成华为性能管理服务
2021-05-09
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2021-05-09
使用Power BI构建数据仓库与BI方案
2021-05-09
Django认证系统并不鸡肋反而很重要
2021-05-09
快用Django REST framework写写API吧
2021-05-09
tep用户手册帮你从unittest过渡到pytest
2021-05-09
12张图打开JMeter体系结构全局视角
2021-05-09
Spring Boot 2.x基础教程:构建RESTful API与单元测试
2021-05-09
[UWP 自定义控件]了解模板化控件(1):基础知识
2021-05-09
UWP 自定义控件:了解模板化控件 系列文章
2021-05-09
[UWP]从头开始创建并发布一个番茄钟
2021-05-09
WinUI 3 Preview 3 发布了,再一次试试它的性能
2021-05-09
使用命令把SpringBoot项目打包成可运行的jar包(简洁,操作性强)
2021-05-09
List数组排序
2021-05-09
VMware vSphere 离线虚拟机安装 BIND 9
2021-05-09
dojo/request模块整体架构解析
2021-05-09
Javascript定时器学习笔记
2021-05-09
dojo的发展历史
2021-05-09
Python存储系统(Redis)
2021-05-09
C语言指针收藏
2021-05-09