Java基础学习(十九)

news/2025/2/24 11:46:17/文章来源:https://www.cnblogs.com/victoria6013/p/18733693

Java基础学习(十九):动态代理

目录
  • Java基础学习(十九):动态代理
    • 概念
    • 使用

本文为个人学习记录,内容学习自 黑马程序员


概念

  • 作用:可以无侵入式地给代码增加额外的功能
  • 代理内部就是对象要被代理的方法
  • 实际步骤:调用者先调用代理中的方法,实现一些额外的功能,再由代理去调用对象中的方法
图19-1

使用

  • 路径:java.lang.reflect.Proxy

  • 创建代理

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

    1. 需要被代理的类:

      // 需要实现接口Star,在接口中指定了需要被代理的方法
      public class BigStar implements Star {private String name;public BigStar() {}public BigStar(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "BigStar{" +"name='" + name + '\'' +'}';}@Overridepublic void sing(String name) {System.out.println(this.name + "正在唱" + name);}@Overridepublic void dance() {System.out.println(this.name + "正在跳");}
      }
      
    2. 接口:

      // 在接口中指定要代理的方法
      public interface Star {public abstract void sing(String name);public abstract void dance();
      }
      
    3. 代理工具类:

      public class ProxyUtil {// 方法的作用:给定一个需要被代理的对象,创建一个代理// 形参:需要被代理的对象// 返回值:创建的代理,由于代理需要实现接口,因此可以直接用接口类型作为返回值类型(多态)public static Star createProxy(BigStar bigStar) {Star star = (Star) Proxy.newProxyInstance(// 参数一:用于指定用哪个类加载器,去加载生成的代理类// 参数二:指定接口,这些接口用于指定生成的代理长什么样,也就是有哪些方法// 参数三:用来指定生成的代理对象要干什么事情ProxyUtil.class.getClassLoader(),new Class[]{Star.class},new InvocationHandler() {@Override// 参数一:代理的对象// 参数二:要运行的方法// 参数三:调用方法时传递的实参public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 进行准备工作(额外的功能)if ("sing".equals(method.getName())) {System.out.println("唱歌准备工作");} else if ("dance".equals(method.getName())) {System.out.println("跳舞准备工作");}// 调用被代理者的方法(原来的功能)——利用反射Object result = method.invoke(bigStar, args);return result;}});return star;}
      }
      
    4. 测试类:

      public class Test {public static void main(String[] args) {BigStar bigStar = new BigStar("明星小a");Star proxy = ProxyUtil.createProxy(bigStar);proxy.sing("歌曲b");proxy.dance();}
      }
      

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

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

相关文章

安川机器人伺服电机维修

在现代工业生产中,安川机器人发挥着至关重要的作用。然而,就像任何机械设备一样,它们也会面临各种故障。机器人故障的出现会严重影响生产效率,增加生产成本。例如,当安川机器人伺服电机出现问题时,可能导致机器人无法精准执行任务,这在自动化生产线上是非常严重的情况。…

BTA24-ASEMI双向可控硅的卓越魅力

BTA24-ASEMI双向可控硅的卓越魅力编辑:ll BTA24-ASEMI双向可控硅的卓越魅力 型号:BTA24 品牌:ASEMI 封装:TO-220F 特性:单向可控硅 正向电流:25A 反向耐压:600V~800V 引脚数量:3 芯片个数:2 包装方式:3000pcs/盘 浪涌电流: 特点:单向可控硅 工作温度:-40℃~150℃ …

36、车辆过户

咨询电话:12123—>1—>5 直接说人工服务(听到对方说咨询就说 人工服务 ) 1、车辆购车日期,看行驶证(这里有个注册日期和发证日期) 2、

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于,在其基础模型 DeepSeek V3 之上,运用了多种强化学习策略。本文将从一个可本地运行的基础模型起步,并参照其技术报告,完全从零开始构建 DeepSeek R1,理论结合实践,逐步深入每个训练环节。通过可视化方式,由浅入深地解析 DeepSeek R1 …

解锁跨境电商成功密码:运营优化五步走

跨境电商运营优化是一个涉及多个方面的复杂过程,以下是一些关键的优化策略: 一、市场调研与精准选品 深入分析目标市场 ○ 通过市场调研工具(如Google Trends、Jungle Scout等)分析市场趋势、竞争程度及潜在需求,挖掘蓝海产品。 ○ 了解目标市场的消费需求、文化差异、政策…

【每日一题】20250224

梦是好的;否则,钱是要紧的。【每日一题】如图所示,放在固定斜面上的物块以加速度 \(a\) 沿斜面匀加速下滑,若在物块上再施加一个竖直向下的恒力 \(F\),则 A. 物块可能匀速下滑 B. 物块仍以加速度 \(a\) 匀加速下滑 C. 物块将以大于 \(a\) 的加速度匀加速下滑 D. 物块将以小…

# 如何让大模型安全地自动生成代码并执行? ## 前言

前言 本文带来的分享是在crewai中使用代码解释器,为了安全,代码在docker中运行。 为什么要使用代码解释器呢? 之前的文章中使用的是function call + 各种工具 来完成一个任务,比如文件读取工具、文件保存工具等。 但是用户的需求是多变的,你很难提前写好所有的工具。 读取…

关于远程桌面

现有电脑A(win11系统)的开机PIN是123;现在想通过windows自带的“远程桌面应用”登录到电脑A上; 下图是电脑A上的设置 (1)、设置允许远程登录(2)将用户Administrator设置为远程桌面用户(3)在与电脑A在同一个网段内的电脑B上,打开远程桌面应用,输入电脑A的IP或电脑名…

Jmeter 性能优化

Jmeter 性能优化:(3优化 + 1补充)1、在 jmx 文件中 Disable 所有的结果输出,如: View Results Tree / Graph Results / Aggregate Report 等。 2、采用命令的方式执行(如果需要生成 HTML,建议分开两段命令执行)如: call jmeter.bat -n -t test.jmx -l result.jtl call…

vite build 打包的文件取消hash码

build: {rollupOptions: {output: {entryFileNames: `assets/[name].js`, // 打包后的入口文件名chunkFileNames: `assets/[name].js`, // 打包后的代码块文件名assetFileNames: `assets/[name].[ext]`, // 打包后的静态资源文件名},},},增加这段代码即可,加的位置需要注意。

再战博客园美化(真正的五)——实际发布

25-02-24 补充 这一篇偶然在我的草稿箱里面被发现。 也就是说,从五开始,少了一篇,而我却没有发现 迭代太快了。 以下是原始文章我不免想到一个问题——如果我弄了这么多以后,发现根本不能用,那咋办? 所以我必须先尝试发布一次,得在博客园上实际看到效果。有一个文件上MB…