JDK动态代理-AOP编程

news2024/10/6 14:35:43

在这里插入图片描述
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

{
    @Override
    public Integer addUser(String name,String pass){
        System.out.println("执行adduser方法"+name);
        return  19;
    }
    @Override
    public 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{
    @Override
    public 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方法
    @Override
    public 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.coloradmin.cn/o/1887349.html

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

相关文章

将数据切分成N份,采用NCCL异步通信,让all_gather+matmul尽量Overlap

将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据二.测试环境三.普通实现四.分块实现 本文演示了如何将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据 1.测试规模:8192*8192 world_size22.单算子:all_gather:0.035…

数字化供应链:背景特点

​背景 1、外部环境 近年来,供应链脆弱性凸显,企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示: 61%的供应链经理预计,供应链紊乱问题至少…

在IDEA中创建Maven项目

相关内容: Maven的安装与配置 在IDEA中配置Maven环境 IDEA中导入Maven项目 2023版IDEA创建Maven项目(新版) 1.打开IDEA,点击 文件 -> 新建 -> 项目 2.创建Maven项目 3.编写java文件并运行 在src -> java -> 创建…

xcode运行ios项目报错Sandbox: rsync.samba(24352) deny(1) file-write-create

xcode运行ios项目报错 Sandbox: rsync.samba(24352) deny(1) file-write-create 解决方案: Update your Xcode project build option ENABLE_USER_SCRIPT_SANDBOXING to No.

谷歌GenType:1分钟生成AI艺术字母表,小众但好用,完全免费!(附教程)

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 最近发现一个好玩的…

2024最新版Redis常见面试题包含详细讲解

Redis适用于哪些场景? 缓存分布式锁降级限流消息队列延迟消息队 说一说缓存穿透 缓存穿透的概念 用户频繁的发起恶意请求查询缓存中和数据库中都不存在的数据,查询积累到一定量级导致数据库压力过大甚至宕机。 缓存穿透的原因 比如正常情况下用户发…

维护Nginx千字经验总结

Hello , 我是恒 。 维护putty和nginx两个项目好久了,用面向底层的思路去接触 在nginx社区的收获不少,在这里谈谈我的感悟 Nginx的夺冠不是偶然 高速:一方面,在正常情况下,单次请求会得到更快的响应;另一方面&#xff0…

1996-2023年各省财政收支数据(无缺失)(地方财政一般预算收入、地方财政一般预算支出)

1996-2023年各省财政收支数据(无缺失)(地方财政一般预算收入、地方财政一般预算支出) 1、时间:1996-2023年 2、来源:国家统计局、统计年鉴、 3、指标:地方财政一般预算收入、地方财政一般预算…

51单片机第23步_定时器1工作在模式0(13位定时器)

重点学习51单片机定时器1工作在模式0的应用。 在51单片机中,定时器1工作在模式0,它和定时器0一样,TL1占低5位,TH1占高8位,合计13位,也是向上计数。 1、定时器1工作在模式0 1)、定时器1工作在模式0的框图…

SUPERVIVE无法联机、联机失败、联机报错的解决办法分享

SUPERVIVE是一款战术竞技游戏,核心玩法为多人大逃杀,40名玩家可以自愿或随机组成2或4人小分队,空降进入末日地图,一边苟着收集资源,一边武装自己,在生存区不断首夺的同时,努力战到最后&#xff…

pycharm中新建的临时python文件存放在哪里?

在pycharm中建立的临时python文件,从哪里可以找到呢? 1.我们打开cmd窗口,进入根目录,用dos命令“dir scratch*.py/a/s”进行查找,发现这些临时文件存放在Roaming\JetBrains\PyCharmCE2022.2\scratches 的目录里面 2.…

2Python的Pandas:读取数据

1.读取Excel文件 1.1.读取数据 import pandas as pd# Excel 文件的 URL 或本地路径 url "https://www.gairuo.com/file/data/dataset/team.xlsx"# 使用 Pandas 的 read_excel 函数读取数据 try:df pd.read_excel(url)print(df.head()) # 打印 DataFrame 的前几行…

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

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

观测云赋能「阿里云飞天企业版」,打造全方位监控观测解决方案

近日,观测云成功通过了「阿里云飞天企业版」的生态集成认证测试,并荣获阿里云颁发的产品生态集成认证证书。作为监控观测领域的领军者,观测云一直专注于提供统一的数据视角,助力用户构建起全球范围内的端到端全链路可观测服务。此…

荣耀大横评,睿蓝7-450荣耀版卷出来的性价比之王

手握11万左右预算,如何在市场内选出一辆合适自己的车?荣耀版车型无疑是当下的最佳答案。在众多荣耀版车型中,比亚迪宋PLUS荣耀版EV520km领先型(后统称宋PLUS荣耀版)、比亚迪元PLUS荣耀版430km领先型(后统称元PLUS荣耀版)、比亚迪海豚PLUS荣耀版420km时尚版(后统称海豚荣耀版)、…

YOLO-V2

一、V2版本细节升级 1、YOLO-V2: 更快!更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout,卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化,收敛相对更容易经过Batch Norma…

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

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

MyBatis-plus这么好用,不允许还有人不会

你好呀,我是 javapub. 做 Java 的同学都会用到的三件套,Spring、SpringMV、MyBatis。但是由于使用起来配置较多,依赖冲突频发。所有,各路大佬又在这上边做了包装,像我们常用的 SpringBoot、MyBatisPlus。 基于当前要…

2024年7月2日 (周二) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键,实现一键唤起、一键隐藏的 Windows 工具,并且支持窗口动态绑定快捷键(无需设置自动实现)。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 经典名作30周年新篇《恐怖惊魂夜…

谷歌网站SEO服务有哪些?

Seo其实说来说去就包含三样,网站本身技术优化,内容以及外链,而这三样里,网站的技术优化是前提本身,确保网站符合谷歌搜索规范,包括调整网站的结构、速度和移动设备兼容性,以提高用户体验和搜索引…