静态代理和动态代理笔记

总体分为:

1.静态代理:

        代理类和被代理类需要实现同一个接口.在代理类中初始化被代理类对象.在代理类的方法中调          用被代理类的方法.可以选择性的在该方法执行前后增加功能或者控制访问

2.动态代理:

        在程序执行过程中,实用JDK的反射机制,创建代理对象,并动态的指定要代理的对象,动态代理          不需要创建代理类

        动态代理是一种创建java对象的能力

java中,想要创建对象:

1.通过构造方法new对象

2.克隆

3.反射

4.反序列化

       2.1.JDK动态代理:  JDK代理是基于接口的代理,要求目标对象实现至少一个接口。JDK 动态         代理是 Java 标准库提供的一种代理机制,它基于接口生成代理对象。JDK 动态代理使用               java.lang.reflect.Proxy 类和 InvocationHandler 接口来创建代理对象,并要求目标对象            必须实现至少一个接口。这种代理机制适用于接口代理,通常用于 AOP 等场景。

       2.2.CGLIB动态代理: MethodInterceptor 是CGLIB代理机制中的一部分,通常与CGLIB代理           一起使用。CGLIB 动态代理是一个独立的字节码生成库,它通过生成目标对象的子类来创建           代理对象,不要求目标对象实现接口。CGLIB 动态代理可以代理普通的类,而不仅仅是实现           了接口的类。这种代理机制适用于类代理,通常用于 ORM 框架Spring 中的@Transactional           等场景。

        2.3.javassist动态代理:Javassist 是另一个字节码操作库,它可以用于生成动态代理类。                Javassist 动态代理与 CGLIB 相似,可以代理普通类,但它的使用方式和实现略有不同。

        2.4.Byte Buddy动态代理:Byte Buddy 是一个现代的字节码生成库,也可以用于创建动态代          理对象。Byte Buddy 提供了更直观和强大的 API,可以用于生成代理类。

使用代理模式的作用:

        1.功能增强:在原有功能前后额外增加功能

        2.访问控制:例如设置条件,条件允许才可以访问

1.静态代理:静态代理的实现中,代理类和被代理类必须实现同一个接口,而且代理类需要自己手工实现且你所要代理的目标类是确定的

        实现简单,容易理解

新建项目

设置下maven与encoding

新建moudle  

举例  

方法前后都加了日志,但对于HelloSpeaker类来说,打日志并非业务逻辑,会增加额外负担

程序中如果这种日志到处需要使用.程序员不得不到处写日志动作.

有没有办法,让程序员修改简单代码,就可以选择性的打日志

定义一个接口HelloSpeaker1好比原来的HelloSpeaker

现在写个静态代理类,这么去做

测试结果  和原来一摸一样

那么我需要打日志的话,就只需要修改一下new HelloProxy(new HelloSpeaker1);

不需要打日志我就new HelloSpeaker();

有时候要学会多变一点

比如在代理类HelloProxy中

定义成员变量时候直接new了

那最后就两种

new HelloProxy();

或者new HelloSpeaker();

代理类为被代理的类增强了功能且可以做访问控制

这就是静态代理

静态代理要求:代理类和被代理的类必须实现同一个接口.

                        缺点:目标类多了,代理类可能也要成倍增加,且接口中的功能增加会影响目标类和

下面看下动态代理

JDK动态代理:  需要目标类实现某个接口

CGLIB代理:CGLIB是第三方工具库,动态创建代理对象

CGLIB原理是继承,通过继承目标类(即被代理类),动态创建它的子类

在子类中重写父类(目标类的)同名方法,实现功能修改(那么目标类不能是final的,方法也不能是final的)

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

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

相关文章

STM32-HAL库07-软件SPI驱动0.96寸OLED

STM32-HAL库07-软件SPI驱动0.96寸OLED 一、所用材料: STM32VGT6自制控制板 STM32CUBEMX(HAL库软件) MDK5 二、所学内容: 通过HAL库配置四个GPIO输出口,对其进行软件模拟SPI发送规则,进而驱动OLED进行数…

C#__文件操作之FileInfo和DirectoryInfo

// 代码(含注释) class Program{static void Main(string[] args){// FileInfo 文件操作FileInfo myFile new FileInfo("D:\C#编程\文件操作之FileInfo和DirectoryInfo\TextFile1.txt");// 实例方法// myFile.CopyTo("D:\C#编程\文件操作…

企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…

OpenCV(三十六):霍夫直线检测

1.检测直线的霍夫变换原理 2.检测直线函数HoughLines() 检测直线流程: Step1:将参数空间的坐标轴离散化。 Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格 Step3:统计参数空间内每个方格出现的次数,选取次数大于某一值的方格作为表示直线的方格…

Prompt Tuning训练过程

目录 0. 入门 0.1. NLP发展的四个阶段: Prompt工程如此强大,我们还需要模型训练吗? - 知乎 Prompt learning系列之prompt engineering(二) 离散型prompt自动构建 Prompt learning系列之训练策略篇 - 知乎 ptuning v2 的 chatglm垂直领域训练记…

如何剪辑视频?方法来了,零基础也能学会!

“视频怎么剪辑呀,刚刚用录屏软件录制了一段视频,但是录进去了很多不需要的画面,需要进行修改,可是不知道视频怎么剪辑,有没有人知道剪辑视频的方法,推荐一下。” 剪辑视频是一门重要的技能,无…

DAY03_瑞吉外卖——公共字段自动填充新增分类分类信息分页查询删除分类修改分类

目录 1. 公共字段自动填充1.1 问题分析1.2 基本功能实现1.2.1 思路分析1.2.2 代码实现1.2.3 功能测试 1.3 功能完善1.3.1 思路分析1.3.2 ThreadLocal1.3.3 操作步骤1.3.4 代码实现1.3.5 功能测试 2. 新增分类2.1 需求分析2.2 数据模型2.3 前端页面分析2.4 代码实现2.5 功能测试…

为什么5G 要分离 CU 和DU?(4G分离RRU 和BBU)

在 Blog 一文中,5G--BBU RRU 如何演化到 CU DU?_5g rru_qq_38480311的博客-CSDN博客 解释了4G的RRU BBU 以及 5G CU DU AAU,主要是讲了它们分别是什么。但是没有讲清楚 为什么,此篇主要回答why。 4G 为什么分离基站为 RRU 和 BBU…

三维模型3DTile格式轻量化压缩模型变形浅析

三维模型3DTile格式轻量化压缩模型变形浅析 在对三维模型进行轻量化压缩处理的过程中,常常会出现模型变形的现象。这种变形现象多数源于模型压缩过程中信息丢失或误差累积等因素。以下将对此现象进行详细分析。 首先,我们需要了解三维模型轻量化压缩的…

无需编程经验,也能制作租车预约微信小程序,快速上手

现在,制作租车预约微信小程序不再需要编程经验,只需几个简单的步骤,您就可以拥有自己的租车预约微信小程序。在本文中,我们将介绍如何利用乔拓云网后台来制作租车预约微信小程序,并实现您所需的功能。 首先&#xff0c…

postgresql|数据库|数据迁移神器ora2pg的安装部署和初步使用

前言: 有的时候有需求需要迁移Oracle数据库的数据到postgresql,那么,其实可供选择的工具是比较多的,但从迁移效率,准确度这些角度来选择的话,无疑还是GitHub上的开源免费工具ora2pg比较合适的。 ora2pg主…

Python之线程(二)

一、线程同步和互斥锁 同一个资源,多人想用?排队啊! 现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题。 比如:教室里,只有一台电脑,多个人都想使用。天然的解决办法就是,在电脑旁边,大家排队。前一人使用完后,后一人再使用。再比如,上厕所排队。 二、线…

SpringBoot 基于 MongoTemplate 的工具类

一、 什么是MongoDB MongoDB基于分布式文件存储的数据库。由C语言编写。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。 他支持的数据结构非常松散,是类似json的bjson格式,因此…

Linux 下静态库与动态库的制作与使用

Linux 下静态库与动态库的制作与使用 文章目录 Linux 下静态库与动态库的制作与使用示例代码:静态库静态库制作静态库使用 动态库动态库制作动态库使用 示例代码: test.c test.h main.c 静态库 静态库制作 以示例代码为例,先执行下面…

使用Python编写高效程序

在当今竞争激烈的互联网时代,搜索引擎优化(SEO)成为了各类网站提升曝光度和流量的关键策略。而要在SEO领域中脱颖而出,掌握高效的网络抓取程序编写技巧是至关重要的。本文将分享一些宝贵的知识和技巧,帮助你使用Python…

c++ 学习之类型,常量以及变量的重点知识

const 和 volatile 组合考点 const int ( * ) 等价于 int const ( * ) const int x 1 ; 说明 x 是常量,无法修改 如何区分指针常量和常量指针 指针常量 为 先有指针后有常量 故为 形式如 : int * const p & x ; 且const 修饰的是 p &#xff0c…

集成学习-树模型

可以分为三部分学习树模型: 基本树(包括 ID3、C4.5、CART).Random Forest、Adaboost、GBDTXgboost 和 LightGBM。 基本树 选择特征的准则 ID3:信息增益max C4.5:信息增益比max CART:基尼指数min 优缺…

Linux入门教程||Linux系统目录结构

登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动Linux时…

【Linux】让笔记本发挥余热,Ubuntu20.04设置WiFi热点

Ubuntu20.04设置WiFi热点 由于卧室距离客厅较远,wifi信号太弱,体验极差。鉴于卧室的笔记本电脑是通过网线连接的客厅路由器,因此考虑将这台老破笔记本作为“路由器”,以便发挥它的余热。实验证明,上网速度提升数十倍&a…

选择排序——直接选择排序

直接选择排序:(以重复选择的思想为基础进行排序) 1、简述 顾名思义就是选出一个数,再去抉择放哪里去。 设记录R1,R2…,Rn,对i1,2,…,n-1,重复下…