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

{
    @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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【驱动篇】龙芯LS2K0300之红外驱动

实验目标 编写HX1838红外接收器驱动,根据接收的波形脉冲解码红外按键键值 模块连接 模块连接:VCC接Pin 2,GND接Pin1,DATA接Pin16 驱动代码 HX1838 GPIO初始化,申请中断,注意:GPIO48默认是给…

vscode语言模式

1.背景 写vue3ts项目的时候,用到了volar插件,在单文件使用的时候,鼠标悬浮在代码上面会有智能提示; 但是最近volar插件提示被弃用了,然后我按照它的官方提示,安装了Vue-official扩展插件,但是…

Vue3 特点以及优势-源码解剖

Vue3 特点以及优势-Vue3.4源码解剖 Vue3 特点以及优势 1.声明式框架 命令式和声明式区别 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中,过程靠 vuejs 来实现 声明式代…

剑神诀_单机架设_无需虚拟机_小白专用

前言 今天给大家带来一款单机游戏的架设:剑神诀,一键端 无需虚拟机 如今市面上的资源参差不齐,大部分的都不能运行,本人亲自测试,运行视频如下: 剑神诀 搭建教程 此游戏架设不需要安装虚拟机,…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie,网络爬虫是一种自动化程序,用于在互联网上收集信息并进行索引,这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统:Windows10系统、Dell G3电脑。 “爬虫…

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

新鲜出炉!恭喜这 5 位同学中选 NebulaGraph 社区 2024 开源之夏项目!

开源之夏是中国科学院软件研究所发起的“开源软件供应链点亮计划”系列暑期活动,旨在鼓励高校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区,针对重要开源软件的开发与维护提供项目开发任务&#xf…

stm32学习笔记---USART串口外设(理论部分)

目录 USART简介 USART的框图 串口的引脚 USART的基本结构 数据帧 起始位侦测 数据采样 波特率发生器 USD转串口模块的原理图 声明:本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记,我之所以记录下来是为了方便自己日后复习。如果你…

个人微信二次开发

​ 由于自身在机器人方面滚爬多年,现在收藏几个宝藏机器人 推荐一下自己常用的机器人: 适合有技术开发的公司,可以自主开发所需要的功能!十分齐全 测试问文档:https://www.wkteam.cn/ 有需要的兄弟可以看一下&#…

手写一个基于SpringBoot的MVC架构,默认实现CRUD和导入导出功能

文章目录 前言正文一、项目结构二、技术点三、部分核心代码3.1 core-tool 中的核心代码3.1.1 所有实体的通用父类 SuperEntity3.1.2 所有枚举的父接口 BaseEnum3.1.3 所有业务异常的父接口 BaseException 3.2 mvc-tool 中的核心代码3.2.1 CrudController 接口定义3.2.2 默认的C…

手写一个类似@RequestParam的注解(用来接收请求体的参数)

一、本文解决的痛点 按照大众认为的开发规范,一般post类型的请求参数应该传在请求body里面。但是我们有些post接口只需要传入一个字段,我们接受这种参数就得像下面这样单独创建一个类,类中再添加要传入的基本类型字段,配合Reques…

清爽一夏,羊大师伴你健康运动,引领活力生活!

在这个绚烂多彩的夏日,让我们携手踏上一段清爽与健康并行的旅程。阳光炽热,万物生长,正是释放活力、追求健康的最佳时节。“清爽一夏,健康运动引领活力生活!”这不仅是一句口号,更是我们向美好生活发出的诚…

模电-运放的供电

模电-运放的供电 Fang XS.1452512966qq.com如果有错误,希望被指出,学习技术的路难免会磕磕绊绊量的积累引起质的变化注:本文章为唐老师讲电赛视频的个人笔记 运放的供电 所有的运放都可以单电源和双电源供电;采用双电源供电的运…

Linux_fileio实现copy文件

参考韦东山老师教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 通过read方式copy文件2. 通过mmap映射方式copy文件 1. 通过read方式copy文件 copy文件代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <…

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…

Java日期时间

java.util包提供Date类&#xff0c;该类有两个构造函数&#xff1a; Date()使用当前日期和时间初始化对象Date(long millisec)从1970年1月1日起的毫秒数 获取当前日期时间 import java.util.Date;public class DateDemo{public static void main(String[] args){//初始化Date…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果&#xff1a; 实现 使用vantui组件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

Java 微信小程序自建平台开发票保存到微信卡包

Java 微信小程序自建平台开发票保存到微信卡包 1 获取Access token2 获取自身的开票平台识别码3 设置商户联系方式4 获取授权页ticket5 获取授权页链接6 小程序打开授权页7 收取授权完成事件推送8 创建发票卡券模板9 上传PDF10 将电子发票卡券插入用户卡包 1 获取Access token …

shopify后台设置为中文

shopify官网&#xff1a;https://link.juejin.cn/?targethttps%3A%2F%2Fshopify.dev%2F 1、点击右上角头像 2、选择个人资料 3、找到Language设置 开发者 1、创建开发商店 2、 3、点击左侧导航在线商店&#xff0c;点击右上角查看你的商店。在线商店链接为https://[商店名…

RK3568驱动指南|第十五篇 I2C-第181章使用GPIO模拟I2C驱动

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…