JavaSE之动态代理

news2025/8/11 16:27:45

目录

  • 动态代理
  • 动态代理的好处
  • Proxy
  • 重写invoke方法
  • 实例
  • 最后

动态代理

动态代理需要确定要代理的对象,所以需要先new一个要代理的对象

动态代理的好处

可以在不改变方法源码的情况下,实现对方法功能的增强。
简化了代码。

提高了软件系统的可扩展性。

Proxy

新建一个代理类:

Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

三个参数分别为:

ClassLoader loader(类加载器): 一般通过当前类反射取得类加载器

Class[] interfaces : 要代理的类实现的接口

InvocationHandler h: 用匿名内部类实现,重写invoke()方法

重写invoke方法

invoke的三个参数

public Object invoke(Object proxy, Method method, Object[] args)

Object proxy :要代理的对象也就是开头说要new出来的对象

Method method : 代理类需要代理的方法

Object[] args : 方法的参数

首先,创建代理对象。

在创建时如果指定了Handler,那么先执行invoke,

同时将所在对象的方法和参数传进来。传进来后继续执行方法体,方法体就写你要增强的内容

实例

1.先定义一个接口

public interface Student {
    void eat();

    void sleep();

    void study();

    void play();
}

2.创建接口实现类

public class StudentImpl implements Student{

    @Override
    public void eat() {
        System.out.println("吃饭");
    }

    @Override
    public void sleep() {
        System.out.println("睡觉");
    }

    @Override
    public void study() {
        System.out.println("学习");
    }

    @Override
    public void play() {
        System.out.println("玩游戏");
    }
}

3.进行动态代理

public static void main(String[] args) {

        //对StudentImpl实现动态代理
        //新建一个要代理的对象
        StudentImpl student = new StudentImpl();
        ClassLoader classLoader = Demo041.class.getClassLoader();
        Class[] classes = {Student.class};//数组用来接收多个Class对象,单一职责原则,一般只用一个,用哪个调用哪个

		//多态。将Object类强转为Student,才能拿到Student中特有的方法
        Student proxy = (Student) Proxy.newProxyInstance(classLoader, classes, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("开始前先祈祷");
                Object result = method.invoke(student, args);
                System.out.println("结束后祈祷");
                System.out.println("-------------------");
                return result;
            }
        });

        proxy.eat();
        proxy.play();
        proxy.sleep();
        proxy.study();
    }

结果:

在这里插入图片描述

最后

如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

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

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

相关文章

【TensorRT】神经网络中的量化

文章目录一、TensorRT 为什么需要量化二、基础内容三、神经网络的量化过程一、TensorRT 为什么需要量化 量化是什么:量化在数字信号处理领域,是指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的&a…

七彩动态|棱镜七彩获“北京国家金融科技认证中心”颁发的「金融开源技术服务商能力评估证书」

11月13日,由北京金融科技产业联盟举办的第二届会员大会第四次会议在北京召开。 聚焦开源应用与安全,棱镜七彩通过北京国家金融科技认证中心“金融业开源评估”—金融开源技术服务商能力评估,并获得由北京国家金融科技认证中心颁发的“金融开…

对梯度回传的理解

参考 对梯度回传的理解 - 云社区 - 腾讯云 神经网络的每一层可以看做是使用一个函数对变量的一次计算。在微分中链式法则用于计算复合函数的导数。反向传播时一种计算链式法则的算法,使用高效的特定运算顺序。 设x是实数,f和g是从实数映射到实数的函数。…

分享一个单片机GUI库,简洁,使用

1-介绍一下 先来几张图: 看着是不是还不错。这个是一个国外的爱好者开发的,笔者有次逛网站,搜GUI看到的没感觉还不错,今天特意给大家分享一下。 这个GUI是一个用于嵌入式系统的免费开源图形库。平台独立的,也就是说可…

OVN 流表基础 -- 基于 kubeOVN (二)

文章目录功能流表加 Pod加子网跨子网 pod 互访访问外部网络DHCP静态路由策略路由安全组DNATLBFullNAT LBService 扩展Src-ip LB功能流表 基于此模型配置功能,来查看流表变化,探讨功能实现方式。 加 Pod 流表添加: Datapath: "ovn-cl…

《Eolink 征文活动- -RESTful接口全解测试-全方位了解Eolink》

目录 Eolink平台首页 Eolink平台下载地址 一、自带环境示例【GET】|【POST】 示例项目: 完成Get请求示例: 完整POST请求示例: 二、自建接口测试【PUT】|【DELETE】 RESTful协议/方法 创建PUT&DELETE的API接口: PUT协…

【linux】虚拟化

linux虚拟化 文章目录linux虚拟化实验环境安装虚拟化服务安装虚拟机遇到报错效果虚拟机管理命令移植虚拟机虚拟机快照由快照创建虚拟机实验环境 1号虚拟机配置局域网镜像仓库,httpd服务2号虚拟机保证可以使用dnf搜索到1号的镜像仓库 安装虚拟化服务 查看是否支持v…

代码随想录刷题|动态规划理论基础 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

目录 动态规划理论基础 509. 斐波那契数 思路 斐波那契数 递归思路 动态规划 动态规划(优化数组) 70. 爬楼梯 思路 爬楼梯 动态规划(优化数组) 动态规划(变量替代数组) 746. 使用最小花费爬楼梯 思路 使用最小花费爬楼梯 动态规划(使用数组) 动态规划(使用变量) 动态规划理论基…

顺风车用户最爱“送花”城市Top30 出炉,来看有没有你的家乡?

11月18日,嘀嗒小红花迎来“一周岁生日”,嘀嗒出行也于当日正式发布《嘀嗒小红花一周年出行人文报告》。《报告》显示,自2021年11月18日,嘀嗒出行“送你一朵小红花”产品功能上线至今,嘀嗒顺风车乘客已向车主送出239万朵…

商品720vr全景环物制作便捷推送到全世界

720vr全景的应用范围也得到了扩大和普及。VR全景作为新一代信息技术,相较于传统的图文视频等展现方式而言,VR全景不仅能够帮助用户随时随地身临其境的进行沉浸式体验,也可以帮助商家有效降低宣传推广成本。 720VR全景制作拍摄VR全景需要用到相…

德国药品数据库查询系统(含网址)

德国曾经有被誉为世界’医药基地’的称号。在2020年时德国药品出口额有近千亿美元,占世界药品出口总额的近七分之一,连续18年为居世界第一位,不仅仅是销量,德国生物医药行业在心脏、血液循环、糖尿病、癌症等疾病的研究、预防、基…

用Python计算点估计预测评价指标(误差指标RMSE、MSE、MAE、MAPE) ,画图展示

机器学习的回归问题常用RMSE,MSE, MAE,MAPE等评价指标,还有拟合优度R2。由于每次预测出来的预测值再去和原始数据进行误差评价指标的计算很麻烦,所以这里就直接给出他们五个指标的计算函数。把每次预测出来的值和真实值输入这个函数就可以得到…

对话钱江机器人丨国产化破风,谁动了工业机器人厂商的“奶酪”?

工业机器人的研发、制造和应用是衡量一国科技创新和高端制造水平的重要标志,是“制造业皇冠顶端的明珠”,亦是硬科技技术行列中的“课代表”。 《中国机器人产业发展报告(2022年)》预计,2022年全球机器人市场规模将达…

抗心血管疾病、内分泌信号通路等小分子化合物库介绍

心血管疾病 不少人认为经常熬夜,工作压力大是猝死的主要原因,其实猝死的根本原因是心血管突发病。 心血管疾病是心脏和血管疾病的统称,主要包括冠心病,脑血管疾病,周围末梢动脉血管疾病,先天性心脏病及深…

快速排序图文详细教程

文章目录 文章目录文章目录[toc]一、快排思路二、相关代码小细节改进版本一版本二一、快排思路 还记得之前的荷兰国旗问题吗(快排的前身:详解荷兰国旗问题),快排其实就是借助这种思路,在每次遍历中以第一个数作为目标…

[模型部署]:深度学习模型部署(已更Pytorch篇)

模型部署一、Pytorch 模型部署1. 模型保存1.1. 使用torch.save()保存1.2. 使用[torch.jit.save()](https://pytorch.org/docs/stable/generated/torch.jit.save.html)保存2. 模型部署 or 模型编译2.1. TorchScript部署2.2. TensorRT部署2.3. TVM部署2.4. Laser部署模型部署 一…

STM32 GD32 标准库移植SFUD

本次移植是在官方源码的基础上进行移植的 本次介绍的两个软件包SFUD/FAL都与FLASH有关,并且都可以独立使用或者结合在一起使用,两个软件包都对操作系统无依赖,可以使用裸机移植,也很方便移植到各种系统。 这两个软件包的作者都是…

Java JDK安装与配置

Java JDK安装与配置 JDK下载 下载地址:JDK下载 最上方是JDK最新版,往下滑将看到最常用的稳定版本:JDK8 选择版本 勾上选框,点击下载 登录Oracle账号: 没有账号可注册或网上寻找账号,建议自行注册登录成功…

我应该是懂居家办公的吧?

近期的广州疫情十分严峻,海珠区,公司那边的地铁停了。 于是成为了一个【天选居家人】。 天河这边还好一点,起码可以下楼做核酸,买菜,拿快递,出入凭24h核酸。 有人说:以前在公司工作总盼望居家办…

Win10配置IIS与 C#/.net项目的发布与IIS部署

1、IIS配置安装 已经安装IIS的可以跳过 在左下搜索框搜索 “启用或关闭windows功能” 点开,勾选如下图所示勾选框后,点击“确定”后进行安装。 安装完成。在搜索框搜索输入IIS,如图,打开IIS应用。 打开后如图所示 2、在VS中打包…