Java代理Ⅱ

目录

静态代理的内存结构图

测试demo

内存图

关于为什么不能直接修改原方法,而是要用代理

参考文章


关于代理我之前写过一篇博客,基本已经讲的差不多了,有兴趣的读者可以去看看

Java代理

最近有了新的感悟,所以记录一下

静态代理的内存结构图

测试demo

接口:明确要代理的目标类的方法

// 连接目标类和代理类的桥梁:接口
public interface Fightable {void fight(Integer power);}

目标类

// 静态代理目标类
public class Hero implements Fightable {@Overridepublic void fight(Integer power) {System.out.println("英雄战斗力为" + power);}
}

代理类

public class HeroProxy implements Fightable {private Hero hero = new Hero();@Overridepublic void fight(Integer power) {// 功能增强+访问控制power++;hero.fight(power);}
}

测试运行demo

public class ToRun {public static void main(String[] args) {HeroProxy heroProxy = new HeroProxy();heroProxy.fight(5);}
}

运行结果:

内存图

其实代理的本质就是简介调用方法,我们可以通过内存图清晰的看到这一点

创建HeroProxy对象之后

执行HeroProxy对象的fight方法

关于为什么不能直接修改原方法,而是要用代理

1. 代理类有可能是外部的jar包当中的类,不能修改

2. 规范的代码习惯,单个方法只履行单个职责,同时一个方法最好不要超过80行,这样写出来的代码可读性以及可维护性(易于测试找bug,一次只测一个功能)都比较好

3.  代码耦合性太高,一旦某次新增/删除/修改的功能代码出现了bug,会导致整个方法无法被调用;如果使用代理,则最多代理方法出现问题(也就是所谓的解耦)

4. 代理可以在不修改原代码的基础上,扩展和增强实现,还能隐藏部分实现过程和细节

5. 代理具有更好的灵活性,随时可以增删改功能,还可以调换功能的增强顺序

参考文章

廖雪峰的官方网站-代理

10分钟看懂动态代理设计模式

Java程序中的代理作用和应用场景及实现

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

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

相关文章

基于springboot实现毕业设计系统项目【项目源码+论文说明】

基于springboot实现毕业设计系统演示 摘要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff…

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查…

cocos中的meta文件有什么用?如何生成?

cocos中的.meta文件有什么用?如何生成? 1. .meta文件有什么用? Cocos Creator 会为 assets 目录下的每一个文件和目录生成一个同名的 meta 文件 示例 {"ver": "4.0.23", // 版本"importer": "typescr…

Mybatis入门之在基于Springboot的框架下拿到MySQL中数据

介绍 Java技术操作数据库 MyBatis是一款优秀的持久层框架 用于简化JDBC的开发 优秀的持久层框架 我们要基于Springboot整合Mybatis 实操 学习 基于Mybatis是如何操作数据库的 通过MyBatis书写SQL语句 SQL语句执行完毕后 会将查询结果返回给Java程序 表中数据会自动封装…

Mongodb中的索引

目录 索引的类型 单字段索引 符合索引 其他索引 索引的管理操作 查看索引 创建索引 移除索引 索引的使用 执行计划 覆盖的索引查询 索引支持在MongoDB中高效地执行查询。 如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档&a…

Java入门基础学习笔记1——初识java

1、为什么学习java? 几乎统治了服务端的开发;几乎所有的互联网企业都使用;100%国内大中型企业都用;全球100亿的设备运行java。开发岗位薪资高。 Java的流行度很高,商用占有率很高。 可移植性。 2、Java的背景知识 …

QT C++ widget layout 嵌套 例子2

在上篇文章中描述了实中套虚(用setLayout),虚中套实(用addWidget)。 本文再加1条,虚中套虚(用addLayout)。 所谓虚中套虚,是layout 套 layout 。 另外用循环代码生成从…

怎么用照片制作gif动图?一个网站在线做

在数字图像处理中,动态图片是我们日常生活中不可缺少的一部分。Gif动图以为器画面展示的形式,文件的体积以及兼容性而备受喜爱。通过使用多张照片制作gif动画的操作,可以让我们制作出生地有趣的gif动态效果,能够更好更快的传达信息…

太阳能无人机的多元化应用

随着新能源技术的不断发展和成熟,太阳能在无人机的应用技术已经成熟。太阳能无人机得到了量产和广泛的应用。传统无人机相比,太阳能无人机无需燃油,运行费用低廉,搭载多种高科技设备,能够高效、多元化地采集和分析各类…

【算法】Dijkstra求最短路算法

TOP提示:Dijkstra算法只适用于不含负权边的情况 Dijkstra算法是一个基于贪心,广搜和动态规划 求图中某点到其他所有点的最短路径的算法 一、步骤 首先我们先总结Dijkstra算法的完整步骤 我们需要一个dis数组存储从起点到达其他节点的最短距离&…

无列名注入

在进行sql注入时,一般都是使用 information_schema 库来获取表名与列名,因此有一种场景是传入参数时会将 information_schema 过滤 在这种情况下,由于 information_schema 无法使用,我们无法获取表名与列名。 表名获取方式 Inn…

【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】

1 问题描述 为系统和锁屏分别设置两张不同的壁纸,然后在锁屏界面长按Power调起google语音助手后,有时候会出现壁纸不可见的情况,如以下截图所示: 有的时候又是正常的,但显示的也是系统壁纸,并非是锁屏壁纸…

ETL中如何执行Python脚本

Python的解读 Python 是一种高级、通用的编程语言,由荷兰程序员吉多范罗苏姆(Guido van Rossum)于1990年代初设计并发布。Python的设计哲学强调代码的可读性和简洁性,它的语法清晰且表达力强,使得开发者能够以更少的代…

深入理解线程的两阶段终止模式:确保线程安全退出

序言 在多线程编程中,线程的安全退出是一个重要的问题。在实际应用中,我们经常需要确保线程在退出时能够完成必要的清理工作,同时避免因资源泄漏或状态不一致而导致的问题。线程的两阶段终止模式是一种解决这个问题的有效方法。本文将深入探…

[windows系统安装/重装系统][step-3]装驱动、打驱动、系统激活

重装系统三部曲 [windows系统安装/重装系统][step-1]U盘启动盘制作,微软官方纯净系统镜像下载-CSDN博客 [windows系统安装/重装系统][step-2]BIOS设置UEFI引导、磁盘分区GPT分区、安装系统[含完整操作拍照图片]-CSDN博客 [windows系统安装/重装系统][step-3]装驱动…

决策树的学习(Decision Tree)

1.对于决策树的概念: **本质上:**决策树就是模拟树的结构基于 if-else的多层判断 2.目的: 对实例进行分类的树形结构,通过多层判断,将所提供的数据归纳为一种分类规则。 3.优点: 1.计算量小,…

解决在Outlook中预定Teams会议不显示入会链接的问题

今天遇到一个很蛋疼的teams问题,花了点时间才解决。本来以为是很简单的问题,随便网上冲浪一下就能找到答案的,结果根本就没有好的解决方案,所以我分享出来希望后来的老哥少走点弯路。 问题描述 简单来说,就是在Outlo…

RobbitMQ基本消息队列的消息接收

1.先给工程引入依赖 父工程有了子工程就不用导了 <!--AMQP依赖&#xff0c;包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml…

用字符串初始化的指针

一. 简介 前一篇文章简单学习了数组与指针的区别&#xff0c;文章如下&#xff1a; C语言中数组与指针的区别-CSDN博客 本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。 二. 初始化指针来指向字符串 初始化指针来指向字符串&#xff0c;例如如下代码就是…

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用&#xff08;7&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&a…