JDK动态代理-AOP编程

在这里插入图片描述
AOPTest.java,相当于main函数,经过代理工厂出来的Hello类对象就不一样了,这是Proxy.newProxyInstance返回的对象,会hello.addUser会替换为invoke函数,比如这里的hello.addUser("sun", "13434");会被替换为public Object invoke(Object proxy, Method method, Object[] args),其中addUser对应method,hello变量对应FkInvocationHandler里面的target对象,然后
Object rvt = method.invoke(target, args);
翻译为
Object rvt = target.method(args);
,args是hello.addUser("sun", "13434");里面的"sun"和"13434"的参数.

package com.hmdp.service.垃圾;public class AOPTest {public static void main(String[] args) {Hello helloTarget = new HelloImpl();//原始的目标对象
//        为目标对象生成动态代理Hello hello = (Hello) MyProxyFactory.getProxy(helloTarget);hello.addUser("sun", "13434");hello.deleteUser(1);World world = new WorldImpl();
//        为目标对象生成动态代理World worldProxy = (World) MyProxyFactory.getProxy(world);worldProxy.info();}
}

Hello.java的接口,interface

package com.hmdp.service.垃圾;public interface Hello {Integer addUser(String name,String pass);void deleteUser(Integer id);
}

HelloImpl.java实现Hello接口

package com.hmdp.service.垃圾;public class HelloImpl implements Hello{@Overridepublic Integer addUser(String name,String pass){System.out.println("执行adduser方法"+name);return  19;}@Overridepublic void deleteUser(Integer id){System.out.println("执行delete方法"+id);}
}

World.java是World接口

package com.hmdp.service.垃圾;public interface World {void info();
}

WorldImpl接口,实现World接口

package com.hmdp.service.垃圾;public class WorldImpl implements World{@Overridepublic void info(){System.out.println("执行info方法");}
}

AuthUtil.java表示用于权限检查的类

package com.hmdp.service.垃圾;public class AuthUtil {public void auth(){System.out.println("------模拟程序执行权限检查------");}
}

FkInvocationHandler.java,用于负责写AOP编程逻辑这里的authUtil.auth()负责权限检查,在所有方法前面增加权限检查,logUtil.log负责在所有方法的后面都添加通用的处理逻辑,即打日志,这就是AOP编程的优势,如果这是几千个方法,那么工作量将会是巨大的,如果使用AOP编程,那么就能在所有方法执行逻辑位置增加处理,提高编程效率。

package com.hmdp.service.垃圾;import java.lang.reflect.Method;public class FkInvocationHandler implements java.lang.reflect.InvocationHandler{//被代理的目标对象private Object target;public FkInvocationHandler(Object target){this.target = target;}//动态的代理类的所有方法都将替换成该invoke方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {AuthUtil authUtil = new AuthUtil();
//        执行权限检查authUtil.auth();Object rvt = method.invoke(target, args);//target.method(args);调用目标对象的Method方法LogUtil logUtil = new LogUtil();logUtil.log();return rvt;}
}

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

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

相关文章

Web3 ETF 的软件开发框架

Web3 ETF 的软件开发框架主要包含以下几个方面,需要说明的是,Web3 ETF 仍处于早期发展阶段,相关技术和标准尚未成熟。在开发 Web3 ETF 时,需要谨慎评估风险,并做好安全防范措施。北京木奇移动技术有限公司,…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…

Python协作运动机器人刚体力学解耦模型

🎯要点 🎯腿式或固定式机器人模型 | 🎯网格、点云和体素网格碰撞检测 | 🎯正反向运动学和动力学 | 🎯机器人刚体力学计算 | 🎯编辑参考系姿势和路径 | 🎯软件接口实体机器人模拟 | &#x1f3a…

分子AI预测赛Task2笔记

下面所述比较官方的内容都来自官方文档 ‍‌⁠‌‍​​​‌​​⁠​​​​​​​​‍‬​​‍⁠‍‍​​‬​‌​​​‌‍‬​​​​​​‍‌Task2:赛题深入解析 - 飞书云文档 (feishu.cn) 赛题背景 强调了人工智能在科研领域&…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道,被删除的文件一般都会经过回收站,想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样,但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗&am…

java反射和注解

反射 获取class对象的三种方法 ①:Class.forName("全类名"); ②:类名.class ③:对象.getclass(); 代码样例 package com.ithema;public class Main {public static void main(String[] args) throws ClassNotFoundException {//第…

基于Canvas的Html5多时区动态时钟实战

目录 前言 一、关于Canvas技术 1、Canvas是什么 2、Canvas的属性及渲染特性 二、Canvas动态多时区展示 1、新建html页面 2、创建Canvas对象 3、绘制所有的时钟 总结 前言 出差旅行相信大家一定会住酒店,大家在酒店的前台进行预订的时候,是不是都…

centos执行yum相关命令报错的可能原因

文章目录 1. 执行yum命令是报下面一大帕拉2. 安装某个包报错,找不到这个包 1. 执行yum命令是报下面一大帕拉 最后一行报错,在repo文件中找不到空baseurl:xxx / x86_64 执行这行命令把这个找不到的 xxx 禁掉即可sudo yum-config-manager --di…

【项目日记(三)】搜索引擎-搜索模块

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多项目内容 目录 1.前言2.项目回顾3.搜索流程3.1分词3.2触发3.3去重3.4排序3.5包装 4.总结 1.前言 在前…

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题

虚拟机USB——解决每次插U盘都得选择连接到主机还是虚拟机问题 1.编辑–>首选项–> 2.如果想每次插U盘都连接到主机就选“将设备连接到主机” 如果想每次插U盘都进行选择,就选择“询问要执行的操作”

在 Mac 上使用 本地 LLM 文本终结

我们可使用本地大型语言模型,如Mistral、Llama等,来给文本做总结,相比在线的 Kimi ,ChatGPT, 我们不用担心数据泄露,因为整个操作都是在本地电脑完成的。 我们用 ollama 举例 首先安装 ollama https://ol…

数组-二分查找

二分查找 leetcode704 /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left 0, right nums.length - 1;while (left < right) {const mid Math.floor((right - left) / 2) left;const num nums[mid]…

SpringSecurity中文文档(体系结构).md

体系结构&#xff08;Architecture&#xff09; 本节讨论基于 Servlet 的应用程序中 Spring Security 的高级体系结构。我们将在参考文献的身份验证、授权和防止利用部分中构建这种高层次的理解。 过滤器的综述 &#xff08;A Review of Filters&#xff09; Spring Securit…

实现WebSocket聊天室功能

实现WebSocket聊天室功能 什么是WebSocket&#xff1f;WebSocket的工作原理服务器端实现客户端实现 在现代Web开发中&#xff0c;实时通信已经变得越来越重要。传统的HTTP协议由于其无状态和单向通信的特点&#xff0c;无法很好地满足实时通信的需求。而WebSocket协议则应运而生…

【讨论C++继承】

讨论C继承 继承定义继承方式和访问限定符 基类和派生类的赋值转换继承中的作用域派生类的默认成员函数继承和友元继承和静态成员菱形继承虚拟继承 继承是面向对象程序设计中&#xff0c;使代码可以复用的重要手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展。 继…

【ONLYOFFICE】| 桌面编辑器从0-1使用初体验

目录 一. &#x1f981; 写在前面二. &#x1f981; 在线使用感受2.1 创建 ONLYOFFICE 账号2.2 编辑pdf文档2.3 pdf直接创建表格 三. &#x1f981; 写在最后 一. &#x1f981; 写在前面 所谓桌面编辑器就是一种用于编辑文本、图像、视频等多种自媒体的软件工具&#xff0c;具…

算法训练营day24--93.复原IP地址 +78.子集 +90.子集II

一、93.复原IP地址 题目链接&#xff1a;https://leetcode.cn/problems/restore-ip-addresses/ 文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1fA4y1o715 1.1 初…

d3dcompiler_47.dll缺失怎么修复?d3dcompiler_47.dll修复使用说明

d3dcompiler_47.dll是一个重要的系统文件&#xff0c;属于MicrosoftWindows操作系统中Direct3D的一部分&#xff0c;它主要负责处理在Windows上运行的应用程序和游戏中的3D图形编程。这个DLL文件是“DirectX”的一项组成部分&#xff0c;DirectX是一套核心技术&#xff0c;用于…

13-Django项目--文件上传

目录 前端展示 路由: 数据库字段: 函数视图: 前端展示 {% extends "index/index.html" %}{% block content %}<div class"container"><input type"button" id"btnAdd" value"上传荣耀" class"btn btn-succ…