当前位置: 首页 > news >正文

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

相关文章:

  • el-config-provider在Vue3中自定义命名空间实现
  • 【笔记】Spring Cloud Gateway 实现 gRPC 代理
  • MM-LLM:使用Llava类构建图文多模态大模型实践
  • js中添加数组元素的方法
  • Go语言学习:每日一练2
  • EFCore_悲观锁与乐观锁(MySQL)
  • Unity 粒子特效(下)
  • 服务器BMC基础知识总结
  • vue3弹窗usehook
  • C#面:举列 a=10,b=15,在不用第三方变量的前提下,把a,b的值互换
  • Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲
  • 图形化用户界面-java头歌实训
  • python本学期所有代码!
  • 容器内存
  • 13 Redis-- 数据一致性模型、MySQL 和 Redis 的数据一致性
  • 【RocksDB】TransactionDB源码分析
  • Git初体验
  • java8-模拟hadoop
  • Rancher如何对接Ceph-RBD块存储
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue实战(四)登录/注册页的实现
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈web中前端模板引擎的使用
  • 如何在 Tornado 中实现 Middleware
  • 设计模式走一遍---观察者模式
  • 深入浅出webpack学习(1)--核心概念
  • 自动记录MySQL慢查询快照脚本
  • 国内开源镜像站点
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • !!Dom4j 学习笔记
  • #define用法
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #大学#套接字
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (备忘)Java Map 遍历
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)JPA - JQPL 实现增删改查
  • (五)IO流之ByteArrayInput/OutputStream
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Unity3DUnity3D在android下调试
  • (转)我也是一只IT小小鸟
  • .Net 8.0 新的变化
  • .Net Redis的秒杀Dome和异步执行
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net8.0与halcon编程环境构建
  • .NET序列化 serializable,反序列化
  • .net中调用windows performance记录性能信息