当前位置: 首页 > news >正文

Java—— 动态代理

代理的作用

对象如果嫌身上干的事太多的话,可以通过代理来转移部分职责。也就是说,代理可以无侵入式的给对象增强其他的功能

使用代理时,调用者先调用代理中的方法,让代理做一些准备工作,再由代理调用对象中的方法,从而增强了对象的功能

代理中的方法

对象有什么方法想被代理,代理就一定要有对应的方法。代理里面的方法就是对象要被代理的方法

使用接口将代理与对象中的方法统一起来

创建代理对象

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法

public static object newProxyInstance(参数一,参数二,参数三)

参数一:ClassLoader loader 用于指定用哪个类加载器,去加载生成的代理类
参数二:Class<?>[] interfaces 指定接口,用于指定生成的代理,也就是有哪些方法
参数三:InvocationHandler h 用来指定生成的代理对象要干什么事情

代码演示

接口

public interface PersonInterface {//把所有要代理的方法定义在接口中public abstract String eat(String food);public abstract void sleep();
}

Person类

public class Person implements PersonInterface {private String name;public Person() {}public Person(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String eat(String food) {System.out.println(name + "吃了" + food);return "吃完了";}@Overridepublic void sleep() {System.out.println(name + "正在睡觉");}public String toString() {return "Person{name = " + name + "}";}
}

创建代理工具类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;//工具类创建代理
public class ProxyUtil {public static PersonInterface creatProxy(Person person){//参数一:用于指定用哪个类加载器,去加载生成的代理类//参数二:指定接口,用于指定生成的代理,也就是有哪些方法//参数三:用来指定生成的代理对象要干什么事情//返回值:创建的代理PersonInterface pi = (PersonInterface) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{PersonInterface.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//参数一:代理的对象//参数二:要运行的方法//参数三:调用方法时,传递的实参if ("eat".equals(method.getName())){System.out.println("准备碗筷");} else if ("sleep".equals(method.getName())) {System.out.println("准备床铺");}//反射return method.invoke(person,args);}});return pi;}
}

测试类

public class Test {public static void main(String[] args) {//获取代理Person p = new Person("张三");PersonInterface pi = ProxyUtil.creatProxy(p);//调用eat方法String result = pi.eat("米饭");System.out.println(result);//准备碗筷//张三吃了米饭//吃完了//调用sleep方法pi.sleep();//准备床铺//张三正在睡觉}
}
http://www.xdnf.cn/news/1350757.html

相关文章:

  • 【Linux网络编程】分布式Json-RPC框架 - 项目设计
  • UAD详解
  • BEVDepth
  • 领码方案:新一代页面权限体系全景解析(完整版)
  • 英伟达显卡GPU驱动的本质
  • 在WSL2 Ubuntu中部署FastDFS服务的完整指南
  • 【K8s】整体认识K8s--K8s架构与集群创建过程
  • GRS认证是国际供应链的“硬性门槛“
  • 数据库字段类型深度解析:从关系型到 NoSQL 的全面指南
  • 自动化运维Ansible
  • 强光干扰与密集场景下工服识别准确率↑89%!陌讯多模态融合算法在安全生产中的实战优化
  • 在Excel和WPS表格中快速插入多行或多列
  • 一个适用于 Word(Mac/Win 通用) 的 VBA 宏:把所有“上角标格式的 0‑9”以及 “Unicode 上角标数字 ⁰‑⁹” 批量删除。
  • PYTHON让繁琐的工作自动化-列表
  • 构建现代高并发服务器:从内核机制到架构实践
  • Win11 下卸载 Oracle11g
  • 青少年机器人技术(五级)等级考试试卷(2020年9月)
  • 基于Python对酷狗音乐排行榜数据分析可视化【源码+LW+部署】
  • 【Win】Motrix+Aria2浏览器下载加速
  • 深入解析Spring Boot自动配置原理:简化开发的魔法引擎
  • 在 Spring Boot 中配置和使用多个数据源
  • C++之list类的代码及其逻辑详解 (中)
  • 构建真正自动化知识工作的AI代理
  • 随着威胁的加剧,地方政府难以保卫关键基础设施
  • Java项目:基于SpringBoot和Vue的图书个性化推荐系统(源码+数据库+文档)
  • 以太坊智能合约地址派生方式:EOA、CREATE 和 CREATE2
  • C语言宏用法
  • Python 地理空间分析:核心库与学习路线图
  • ESP32应用——UDP组播/广播(ESP-IDF框架)
  • HarmonyOS 递归实战:文件夹文件统计案例解析