Java动态代理 | 代码实现Demo

一、代码实现

1. 编写UserService接口

import java.util.List;public interface UserService {/*** 登录*/void login(String userName, String password);/*** 查询用户列表*/List<String> getUserList();
}

2. 编写UserService接口实现类

import java.util.Arrays;
import java.util.List;public class UserServiceImpl implements UserService{@Overridepublic void login(String userName, String password) {if(userName.equals("Rem") && password.equals("5201314")){System.out.println("登陆成功,欢迎您蕾姆~");}}@Overridepublic List<String> getUserList() {List<String> users = Arrays.asList("蕾姆", "雪乃","三玖", "藤原千花");System.out.println("查询到的用户是:" + users);return users;}
}

3. 编写代理工具类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** 代理工具类*/
public class ProxyUtils {/*** 创建UserService的代理实例* 该方法用于生成UserService接口的代理对象,以便在调用特定方法时添加额外的逻辑** @param userService UserService接口的实现对象* @return UserService接口的代理对象*/public static UserService createProxy(UserService userService) {/*创建UserService的代理实例参数1:当前代理工具类的类加载器参数2:代理对象需要实现的接口,这里是 UserService参数3:定义代理对象的方法调用逻辑*/UserService userServiceProxy = (UserService) Proxy.newProxyInstance(ProxyUtils.class.getClassLoader(),new Class[]{UserService.class},new InvocationHandler() {/*** 方法调用的代理逻辑* 当调用代理对象的方法时,该方法会被调用* 在这里可以添加额外的逻辑,比如方法执行时间的统计** @param proxy 代理类实例* @param method 被调用的方法对象* @param args 方法参数* @return 方法的返回值* @throws Throwable 方法执行过程中抛出的异常*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 对特定方法名进行判断,以决定是否统计方法执行时间if (method.getName().equals("login") || method.getName().equals("getUserList")) {long startTime = System.currentTimeMillis();// 执行方法Object res = method.invoke(userService, args);long endTime = System.currentTimeMillis();System.out.println(method.getName() + "方法执行时间为:" + (endTime - startTime)/1000.0 + "s")  ;return res;} else {// 执行方法return method.invoke(userService, args);}}});return userServiceProxy;}
}

4. 编写测试类

public class UserTest {public static void main(String[] args) {// 创建用户对象 (对象实现功能:执行方法逻辑)// UserService userService = new UserServiceImpl();// 创建用户代理对象 (代理对象实现功能:执行方法逻辑,并统计方法执行时间)UserService userService = ProxyUtils.createProxy(new UserServiceImpl());// 调用方法userService.login("Rem", "5201314");System.out.println("======================================");userService.getUserList();}
}

5. 实现结果

动态代理实现结果

二、参考资料

  • 【黑马磊哥】Java动态代理深入剖析,真正搞懂Java核心设计模式:代理设计模式

三、后记

  • 最近在看动态代理相关的教程,写了一个demo,分享给大家,后续还会更新更深层次的Java动态代理解析。
  • 要是文章对您有帮助,欢迎点赞、收藏、评论、关注!

在这里插入图片描述

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

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

相关文章

JS两数之和

文章目录 &#x1f453;题目描述&#x1f576;思路&#x1f97c;方法一&#x1f9e4;方法二&#x1fa72;方法三&#x1f9e5;总结 &#x1f453;题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&am…

VScode运行C语言终端输出中文乱码问题解决方案

VScode运行C语言输出中文乱码问题解决方案 由于 VSCode 的终端是对系统的 cmd 命令行工具的调用&#xff0c;而 cmd 的默认编码为 GBK。当我们在 VSCode 中以 UTF-8 编码进行代码编写且代码里含有中文字符时&#xff0c;在终端运行代码便会出现中文乱码现象。要解决此问题&…

mysql查看和修改默认配置

1.查看最大连接数 SELECT max_connections; 或者 SHOW VARIABLES LIKE max_connections;2.查看当前连接的客户端 SHOW PROCESSLIST;2.临时设置最大连接数 SET GLOBAL max_connections 500;3.临时设置连接客户端交互超时时间 SET GLOBAL interactive_timeout 1800;4.永久生…

使用 rbenv 安装 Ruby 2.7.5

如果尚未安装 rbenv&#xff0c;可以使用 Homebrew 安装它&#xff1a; brew install rbenv brew install ruby-build初始化 rbenv&#xff1a; rbenv init在终端中运行以下命令将 rbenv 添加到你的 shell 中&#xff1a; open .bash_profile复制代码到文件中 eval “$(rbenv…

R语言机器学习算法实战系列(六)K-邻近算法 (K-Nearest Neighbors)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍教程下载数据加载R包导入数据数据预处理数据描述数据切割调节参数构建模型预测测试数据评估模型模型准确性混淆矩阵模型评估指标ROC CurvePRC Curve保存模型总结优点:缺点:系统信…

Unity中通过给定的顶点数组生成凸面体的方法参考

这里我们使用了Quickhull for Unity插件&#xff0c;其实就是一个ConvexHullCalculator.cs文件&#xff0c;代码如下&#xff1a; /*** Copyright 2019 Oskar Sigvardsson** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software…

当下主流技术下,程序员如何在科技浪潮中找到价值所在

在当今技术日新月异的时代&#xff0c;科技的浪潮不断改变着世界的运作方式&#xff0c;也重塑了程序员们的职业道路。对于程序员来说&#xff0c;找到自身的价值所在&#xff0c;保持技能的持续更新&#xff0c;不仅是职业发展的必修课&#xff0c;更是适应未来科技社会的必然…

KdTree与八叉树的比较:如何在多维空间中有效管理数据

在计算机科学、机器人学和计算机图形学中&#xff0c;如何高效地管理和查询空间中的数据点是一个非常重要的问题。两种常用的数据结构KdTree&#xff08;K-Dimensional Tree&#xff09; 和 八叉树&#xff08;Octree&#xff09; 正是为此而设计。尽管它们的目标相似&#xff…

【Linux】僵尸进程和孤儿进程

一、僵尸进程 何为僵尸进程&#xff1f; 在 Unix/Linux 系统中&#xff0c;正常情况下&#xff0c;子进程是通过父进程创建的&#xff0c;且两者的运行是相互独立的&#xff0c;父进程永远无法预测子进程到底什么时候结束。当一个进程调用 exit 命令结束自己的生命时&#xff…

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景&#xff1a; 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案&#xff1a; 提示&#xff1a;修改注册表如果操作不当会影响电脑&#xff0c;请提前备份注册表&#xff01;&#xff…

【Linux】【命令】diff

diff DescriptionsArgumentsExamples直接使用diff命令-u 输出格式-c 输出格式并列输出-s 和 -q 脚本示例示例1&#xff1a;目录及文件差异 Descriptions diff命令用于对比两个文件或者两个文件夹的不同之处&#xff0c;求基本语法如下所示&#xff1a; diff [OPTION]... FILES…

Oracle 11g 之 ADG 主备 Switchover 手动切换实践

全文目录&#xff1a; 开篇语&#x1f4dc; 前言&#x1f4d1; 摘要&#x1f4dd; 简介&#x1f50d; 概述&#x1f4bb; 核心源码解读&#x1f468;‍&#x1f4bb; 类代码方法介绍及演示 &#x1f4ca; 案例分析&#x1f310; 应用场景演示✅ 优缺点分析优点缺点 &#x1f9e…

ue5 扇形射线检测和鼠标拖拽物体

这里的NumTrace是要发射几根射线&#xff0c;Degrees Per Trace是每根射线之间的角度&#xff0c; 例如 要在角色面前实现一个180度的扇形射线检测&#xff0c;就需这两个变量乘起来等于180 TraceLength是射线的长度 下面是鼠标拖动物体逻辑&#xff0c;很简单 这里的Floor和…

【APIPost】学习与实践,如何使用 APIPost 测试 Java 后端项目

文章目录 1. 什么是 APIPost&#xff1f;2. 安装 APIPost3. APIPost 的基本界面介绍4. 基础功能介绍4.1 创建新请求4.2 设置请求头与参数4.3 查看响应结果4.4 保存请求 5. 环境变量配置5.1 创建环境变量5.2 在请求中使用环境变量 6. API 测试调试功能6.1 Mock 测试6.2 自动化测…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中&#xff0c;archetype&#xff08;原型&#xff09;用来表示一个world里具有相同component类型组合的entity。也就是说&#xff0c;相同component类型的entity在Unity内部会存储到一起&#xff0c;共享同一个archetype。 使用这样的设…

数据的全量加载和增量加载

全量和增量是数据加载过程中常用的两种方法&#xff0c;它们在数据提取和加载策略上有明显的区别&#xff1a; 全量加载&#xff08;Full Load&#xff09; 定义&#xff1a;全量加载是指每次将源系统中的所有数据提取并加载到目标系统中。 特点&#xff1a; 数据完整性&…

一篇文章入门Pytest!

目录 一、安装 二、语法 三、执行 四、前后置setup/teardown 五、fixture 六、数据驱动 七、报告 一、安装 需要安装的库 pytest pytest-html 生成HTML格式的测试报告 pytest-xdist 用例分布式执行&#xff0c;多CPU分发 pytest-ordering …

【Bug】iOS 不支持运行或调试你的项目的上一个生成版本。 请先确保生成解决方案,再运行或调试它。

文章目录 问题问题代码原因解决处理Bug的具体步骤 问题 在windows以hot restart&#xff08;hot restart不需要mac 而pair to mac需要&#xff09;的方式部署到iphone报&#xff1a;不支持运行或调试你的项目的上一个生成版本。 请先确保生成解决方案&#xff0c;再运行或调试…

基于SSM宠物信息交流平台JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

东芝TB67B008FTG三相无刷马达驱动IC

TB67B008FTG是一款无刷直流电机用的三相PWM驱动器&#xff0c;专为无传感器的应用场景设计。它具有一系列突出的功能&#xff0c;使其在现代电机控制中发挥重要作用&#xff0c;尤其是在需要高效、稳定运行的场景中。本文将详细介绍TB67B008FTG的特点、应用以及它在电机控制领域…