动态代理
动态代理
基本实现步骤
设计模式:一些通用的解决固定问题的方式
概念:
- 真实对象:被代理的对象
- 代理对象:
- 代理模式:代理对象代理真实对象 达到增强真实对象功能的目的
实现方式:
- 静态代理:有一个类文件描述代理模式
- 动态代理:在内存中形成代理类
- 实现步骤:
- 代理对象和真实对象实现相同的接口
- 代理对象=Proxy.newInstance();
- 使用代理对象调用方法
- 增强方法
- 实现步骤:
代码
SaleComputer接口
package com.bai.proxy; public interface SaleComputer { public String sale(double money); public void show(); }
Lenovo类
package com.bai.proxy; public class Lenovo implements SaleComputer { public String sale(double money) { System.out.println("花了"+money+"元买了一台联想电脑..."); return "联想电脑"; } public void show() { System.out.println("展示电脑..."); } }
测试类
ProxyTest
package com.bai.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { //创建真实对象 Lenovo lenovo = new Lenovo(); //动态代理增强lenovo对象 /* 三个参数 1.类加载器:真实对象.getClass().getClassLoader() 2.接口数组:真实对象.getClass().getInterfaces() 3.处理器:new InvocationHandler() */ SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /* 代理逻辑编写的方法 代理对象调用的所有方法都会触发该方法执行 参数: 1.proxy:代理对象 2.method 代理对象调用的方法 被封装为的对象 3.args:代理对象调用的方法时 传递的实现参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("该方法执行了..."); System.out.println(method.getName()); System.out.println(args[0]); return null; } }); //调用方法 String computer = proxy_lenovo.sale(8000); System.out.println(computer); proxy_lenovo.show(); } }
运行结果
增强方法
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
代码
测试类
package com.bai.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { //创建真实对象 final Lenovo lenovo = new Lenovo(); //动态代理增强lenovo对象 /* 三个参数 1.类加载器:真实对象.getClass().getClassLoader() 2.接口数组:真实对象.getClass().getInterfaces() 3.处理器:new InvocationHandler() */ SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /* 代理逻辑编写的方法 代理对象调用的所有方法都会触发该方法执行 参数: 1.proxy:代理对象 2.method 代理对象调用的方法 被封装为的对象 3.args:代理对象调用的方法时 传递的实现参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /*System.out.println("该方法执行了..."); System.out.println(method.getName()); System.out.println(args[0]);*/ //判断是否时sqle方法 if (method.getName().equals("sale")){ //1.增强参数 Double money=(Double) args[0]; money=money*0.85; System.out.println("专车接你..."); //使用真实对象调用该方法 Object obj = method.invoke(lenovo, money); //增强返回值 return obj+"_鼠标垫"; }else{ Object obj = method.invoke(lenovo, args); return obj; } } }); //调用方法 String computer = proxy_lenovo.sale(8000); System.out.println(computer); proxy_lenovo.show(); } }
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本