Java动态代理JKD版本

 1、ISale.java

package com.atguigu;
public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou();
}

2、WuDa.java

package com.atguigu;//Target:目标类、目标对象
public class WuDa implements ISale{//target method:目标方法@Overridepublic void saleShaoBing() {System.out.println("卖烧饼...");}@Overridepublic void saleJianBing() {System.out.println("卖煎饼...");}@Overridepublic void saleYueBing() {System.out.println("卖月饼...");}@Overridepublic void saleManTou() {System.out.println("卖馒头...");}
}

3、WuDaInvocationHandler.java

package com.atguigu;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WuDaInvocationHandler implements InvocationHandler {private Object target;public WuDaInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//method表示目标方法String methodName = method.getName();       //获取目标方法名称if (methodName.endsWith("Bing")) {song();}return method.invoke(target,args);}public void song() {System.out.println("送大麦茶...");}
}

4、ProxyTest.java

package com.atguigu;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class ProxyTest {@Testpublic void test03() {WuDa wuDa = new WuDa();WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);System.out.println(wuDa.getClass());  //class com.atguigu.WuDaArrays.stream(wuDa.getClass().getInterfaces()).forEach(System.out::println); //interface com.atguigu.ISaleObject proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);ISale iSale = (ISale) proxyInstance;iSale.saleJianBing();//送大麦茶...//卖煎饼...}@Testpublic void test04() {WuDa wuDa = new WuDa();WuDaInvocationHandler handler = new WuDaInvocationHandler(wuDa);Object proxyInstance = Proxy.newProxyInstance(wuDa.getClass().getClassLoader(), wuDa.getClass().getInterfaces(), handler);ISale iSale = (ISale) proxyInstance;iSale.saleManTou();//卖馒头...}}

Java动态代理是指在运行期间动态地创建一个代理对象,该代理对象可以在调用目标方法前或后添加一些通用的逻辑处理,例如记录日志、安全控制等。而JDK动态代理是指利用Java内置的反射机制,在运行时期间动态生成代理类。具体来说,JDK动态代理会根据传入的接口定义、接口方法以及处理器对象(InvocationHandler)等信息来动态创建代理类,并将代理类与目标对象进行关联,从而实现对目标对象方法的拦截和增强。因为JDK动态代理是基于接口实现的,所以只能代理实现了接口的类。

Java动态代理是一种在运行时动态生成代理类的技术,使用动态代理可以在不修改原始类代码的情况下,为其添加额外的功能或者控制。JDK提供了一个Proxy类和一个InvocationHandler接口,通过这两个类可以实现动态代理。在使用时,需要先创建一个InvocationHandler对象来实现代理的具体逻辑,然后通过Proxy类的静态方法newProxyInstance()来动态生成代理类。动态代理可以极大地简化一些业务代码,比如日志记录,安全检查等等。

 

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

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

相关文章

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】点云

目录 点云及三维图像处理 点云概念 点云的处理 点云的数据处理

DAY60 84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目要求:给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 思路 单调栈 本地单调栈的解法和接雨水的题目是遥相呼…

Doris表的动态分区

动态分区是在Doris 0.12版本中引入的新功能。旨在对表级别的分区实现生命周期管理(TTL),减少用户的使用负担。 目前实现了动态添加分区及动态删除分区的功能。动态分区只支持Range分区。 1 原理 在某些使用场景下,用户会将表按照天进行分区划分,每天定时执行例行任务,这时…

git -1

1.创建第一个仓库并配置local用户信息 git config git config --global 对当前用户所有仓库有效 git config --system 对系统所有登录的用户有效 git config --local 只对某个仓库有效 git config --list 显示配置 git config --list --global 所有仓库 git config --list…

微信小程序 prettier 格式化

一、安装prettier插件 二、打开设置 然后再打开setting.json 新增代码 {"editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","prettier.documentSelectors": ["**/*.wxml", "**/*.wx…

Rust开发——变量、静态变量与常量

1.变量 在 Rust 中,类型安全是通过静态类型系统来实现的。变量绑定默认情况下是不可变的(immutable)。 在 Rust 中声明一个变量时,默认情况下它是不可变的。例如: fn main() {let x :i32 5; // 这是一个…

代码随想录算法训练营第三十一天| 455 分发饼干 376 摆动序列 53 最大子数组和

目录 455 分发饼干 376 摆动序列 53 最大子数组和 455 分发饼干 将胃口值与饼干进行排序使其从小到大。 从后向前遍历胃口值,并取得此时最大的饼干值,如果饼干大于当前胃口值则将答案res加一,并且将饼干减一。 class Solution {public in…

基于 Glibc 版本升级的 DolphinDB 数据查询性能优化实践

在高并发查询、查询需要涉及很多个分区的情况下,低版本的 glibc(低于2.23)会严重影响查询性能。需要升级 glibc 解决该问题优化性能。我们撰写了本文,通过 patchelf 工具修改可执行文件和动态库的 rpath,达到无需升级系…

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…

3分钟看完NVIDIA GPU架构及演进

近期随着 AI 市场的爆发式增长,作为 AI 背后技术的核心之一 GPU(图形处理器)的价格也水涨船高。GPU 在人工智能中发挥着巨大的重要,特别是在计算和数据处理方面。目前生产 GPU 主流厂商其实并不多,主要就是 NVIDIA、AM…

前端为什么不能直接连数据库

其实也不是不可以,只是这样做有很多不好的地方,但是如果是一个只有几个人用的内网小系统,是没有问题的。主要基于以下原因考虑 安全性问题:前端信息都是公开的,从前端访问数据库,就需要将数据库的地址&…

学习黑马AJAX

今天开始学习黑马的AJAX课程,一上来就是注册案例,开始很不习惯axios的语法,感觉好别扭,但前面花了比较长的时间重复敲,现在也熟悉了很多,后面以为的几节课都是围绕http协议的,首先是url的目标资…

利用OpenCV实现图片中导线的识别

下面是一个需求,识别图片中的导线,要在图像中检测导线,我们需要采用不同于直线检测的方法。由于OpenCV没有直接的曲线检测函数,如同它对直线提供的HoughLines或HoughLinesP,检测曲线通常需要更多的图像处理步骤和算法&…

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会…

UEC++ day7

敌人NPC机制 敌人机制分析与需求 新建一个character类来作为敌人,直接建蓝图设置骨骼网格,因为敌人可能多种就不规定死,然后这个敌人肯定需要两个触发器,一个用于大范围巡逻,一个用于是否达到主角近点进行攻击 注意我…

【Flink】Process Function

目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…

https和http的区别和优势

大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…

ventoy安装操作系统

下载ventoy https://github.com/ventoy/Ventoy/releases/download/v1.0.96/ventoy-1.0.96-windows.zip 解压后执行 Ventoy2Disk 2、安装后将ISO放入U盘大的分区,通过U盘启动就可以识别到ISO镜像开始装系统

MySQL 日志管理、备份与恢复

一、MySQL 日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data vim /etc/my.cnf [mysqld] ##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启 log-error/usr/local/mysql/data/mysql_error.log #指定日志的保存位置…