静态代理和动态代理笔记
总体分为:
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的)
相关文章:
静态代理和动态代理笔记
总体分为: 1.静态代理: 代理类和被代理类需要实现同一个接口.在代理类中初始化被代理类对象.在代理类的方法中调 用被代理类的方法.可以选择性的在该方法执行前后增加功能或者控制访问 2.动态代理: 在程序执行过程中,实用JDK的反射机制,创建代理对象,并动态的指定要…...
[SM6225][Android13]user版本默认允许root和remount
开发平台基本信息 芯片: 高通SM6225版本: Android 13kernel: msm-5.15 问题描述 刚刚从Framework踏入性能的小殿堂,User版本默认是不会开启root权限的,而且一般调试需要设置一下CPU GPU DDR performance模式或者修改一些schedule util等调核调频节点去…...
pyinstaller打包exe,使用wexpect的问题
参考github首先打包wexpect 1.进入wexpect目录执行 pyinstaller __main__.py -n wexpect 会生成dist文件夹 2.python代码A.py中使用wexpect,注意wexpect.spawn前后必须按照下面添加代码 import sys,os,wexpect #spawn前 real_executable sys.executable try:if sy…...
OpenCV(三十三):计算轮廓面积与轮廓长度
1.介绍轮廓面积与轮廓长度 轮廓面积(Contour Area)是指轮廓所包围的区域的总面积。通常情况下,轮廓面积的单位是像素的平方。 轮廓长度(Contour Length)又称周长(Perimeter),表示轮廓…...
9.11作业
实现一个对数组求和的函数,数组通过实参传递给函数 sum0 arr(11 22 33 44 55) Sum() {for i in ${arr[*]}do$((sumi))donereturn $sum } Sum ${arr[*]} var$? echo $var写一个函数,输出当前用户的uid和gid,并使用变量接收结果 Sum() {aid -…...
AI伦理与未来社会:探讨人工智能的道德挑战与机会
引言 引出AI伦理和社会影响的主题,强调AI的快速发展和广泛应用。 概述博客的主要内容:探讨AI的伦理挑战以及它对社会的影响。 第一部分:AI的伦理挑战 算法偏见: 解释什么是算法偏见,以及它为何在AI中成为一个重要问题。…...
Android窗口层级(Window Type)分析
前言 Android的窗口Window分为三种类型: 应用Window,比如Activity、Dialog;子Window,比如PopupWindow;系统Window,比如Toast、系统状态栏、导航栏等等。 应用Window的Z-Ordered最低,就是在系…...
微信小程序基础加强总结
本篇文章给大家带来了关于微信小程序的相关问题,其中主要介绍了一些基础内容,包括了自定义组件、样式隔离、数据、方法和属性等等内容,下面一起来看一下,希望对大家有帮助。 1、自定义组件 1.1、创建组件 在项目的根目录中&…...
【JAVA - List】差集removeAll() 四种方法实现与优化
一、场景: 二、结论: 1. 四种方法耗时 三、代码: 一、场景: 求差集 List1 - Lsit2 二、结论: 1. 四种方法耗时 初始条件方法名方法思路耗时 List1.size319418 List2.size284900 List..removeAll(Lsit2)1036987ms…...
sql注入基本概念
死在山野的风里,活在自由的梦里 sql注入基本概念 MYSQL基本语法union合并查询2个特性:order by 排序三个重要的信息 Sql Server MYSQL 基本语法 登录 mysql -h ip -u user -p pass基本操作 show databases; 查看数据库crea…...
AIGC系列:1.chatgpt可以用来做哪些事情?
上图的意思:神器轩辕剑 那么,在现在AI盛行的信息时代, 你是否知道如何获得和利用ChatGPT这一把轩辕剑来提升你的攻击力和生存能力呢? 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是C…...
End-to-End Object Detection with Transformers(论文解析)
End-to-End Object Detection with Transformers 摘要介绍相关工作2.1 集合预测2.2 transformer和并行解码2.3 目标检测 3 DETR模型3.1 目标检测集设置预测损失3.2 DETR架构 摘要 我们提出了一种将目标检测视为直接集合预测问题的新方法。我们的方法简化了检测流程,…...
生成多样、真实的评论(2019 IEEE International Conference on Big Data )
论文题目(Title):Learning to Generate Diverse and Authentic Reviews via an Encoder-Decoder Model with Transformer and GRU 研究问题(Question):评论生成,由上下文评论->生成评论 研…...
项目中应该使用nginx还是拦截器来封禁IP
项目中应该使用nginx还是拦截器来封禁IP 在项目中,使用 Nginx 或拦截器(例如 Spring Interceptor)来封禁 IP 地址都是可行的方法,具体选择取决于你的需求和项目架构。 Nginx 是一种高性能的 Web 服务器和反向代理服务器…...
SMB 协议详解之-NTLM身份认证
前面的文章说明了SMB协议交互的过程,在SMB交互的Session Setup Request/Response会对请求者的身份进行验证,这其中涉及到两个主要的协议NTLM以及Kerberos,本文将对NTLM协议进行详细的说明。 什么是NTLM NTLM是 NT LAN Manager (NTLM) Authentication Protocol 的缩写,主要…...
day34 Set
概述 Set也是集合Collection接口的子接口 Set也是集合Collection接口的子接口 特点:不保证元素有顺序,数组元素不可以重复 HashSet: 底层是基于HashMap的。元素是无序的。元素不可重复,去重机制是依据hashCode()和equals()方法 LinkedHas…...
数据库_之常用API的使用
数据库_之电商API MySQL C API 使用(基本函数) Mysql C API函数详解 MySQL的常用API 一个常用的程序调用MySQL数据库的时候通常都会调用以下API,下面来逐个分析. mysql_init() //函数原型 MYSQL *STDCALL mysql_init(MYSQL *mysql);这个API主要是用来分…...
CTreeCtrl自绘
CSWTreeCtrl.h) #pragma once#define _OWNER_DRAWN_TREE // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl {DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数 public:CSWTreeCtrl();virtual ~CSWTreeC…...
目标检测YOLO实战应用案例100讲-基于深度学习的可见光遥感图像目标检测
目录 前言 遥感图像目标的特点 基于深度学习的目标检测技术 2.1引言 2.2卷积神经网络...
MySQL数据库——存储引擎(2)-存储引擎特点(InnoDB、MyISAM、Memory)、存储引擎选择
目录 存储引擎特点 InnoDB 介绍 特点 文件 逻辑存储结构 MyISAM 介绍 特点 文件 Memory 介绍 特点 文件 区别及特点 存储引擎选择 存储引擎特点 上面我们介绍了什么是存储引擎,以及如何在建表时如何指定存储引擎,接下来我们就来介绍比较…...
【Vue】构建vue项目的几种方法以及区别
【Vue】构建vue项目的几种方法以及区别 1.通过vue-cli进行创建2.直接通过npm进行创建3.基于vite创建vue项目4.总结 构建vue项目时请确保已经安装node和npm 1.通过vue-cli进行创建 要用vue脚手架vue-cli创建vue项目首先我们需要全局安装一下vue-cli,安装命令如下&a…...
动态封装对象,属性来自json
需求: 如何动态的获取一个对象的字段,假如一个对象里面有name,age,sex三个字段,我想取name的值,这个name是存在一个json中,json的格式如下[{"key":"name"},{"key":"age…...
【LeetCode-中等题】90. 子集 II
文章目录 组合并集问题汇总:题目方法一:递归加回溯(去重版) 组合并集问题汇总: 1、子集非去重版本 2、组合非去重版本 3、组合去重版本 题目 本题nums数组存在重复元素,所以本题会涉及一个去重操作&#…...
Docker如何安装seafile
SQLite 方式 要在 Docker 中安装 Seafile,您可以按照以下步骤进行操作: 安装 Docker:确保您的系统上已经安装了 Docker。您可以根据您的操作系统类型,在官方网站上找到适合您系统的 Docker 版本并进行安装。 下载 Seafile 镜像&…...
注册法国商标的步骤和时间
注册法国商标的步骤如下: 1、商标查询:在提交申请之前,建议进行商标查询,以确保商标在法国市场上具有独特性和显著性。 2、提交申请:通过法国知识产权局的在线平台提交商标申请。申请时,需要提供以下文件…...
一起学数据结构(6)——栈和队列
上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构: 在给出队列的概念之前,先给出上篇文章中提到的栈的概念:一种只…...
【数据结构】二叉树的顺序结构-堆
【数据结构】二叉树的顺序结构-堆 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间…...
2024年java面试--mysql(2)
系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…...
IllegalArgumentException
Caused by: java.lang.IllegalArgumentException:Invalid pulsar service : persistent 参数非法异常 这个异常是由于使用了无效的 Pulsar 服务类型导致的。Pulsar 支持不同的服务类型,例如 persistent、non-persistent 等。 当你在配置 Pulsar 相关的参数时&…...
Git 概述命令、idea中的使用
目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…...
怎么打帮人做网站开发的广告/北京口碑最好的教育机构
1.列举你在工作中常用的几个git命令? 新增文件的命令:git add file或者git add . 提交文件的命令:git commit –m或者git commit –a 查看工作区状况:git status –s 拉取合并远程分支的操作:git fetch/git merge或…...
长宁免费网站制作/德州网站建设优化
前言 之前有人让我用Jenkins来做CI/CD,我拒绝了,为什么那?因为我这个人比较懒,我懒得在提交代码后,去GitLab创建一个合并请求,在去Jenkins找到这个项目去运行流水线。我想要一站式的开发体验,不要保存那么多的平台密码,不用记那么多的地址。 本篇文件就来给大家介绍一…...
建立网站不公开/免费个人网站源码
设计模式6大原则-单一职责原则 定义:一个类应该只有一个引起变化的原因。一个类只负责一项职责 如果一个类有多个职责,这些职责耦合在一起,当一个职责发生变化时,可能影响其他的职责。 如: 一个类有 A、B、C 等职责…...
青海公司网站建设哪家好/网站测速工具
1、大致介绍: >_<" 大致执行顺序是:ipl10.nas->asmhead.nas->bootpack.c PS: 这里bootpack.c要调用graphic.c、dsctbl.c、fifo.c、int.c实现功能,其中有些函数还必须汇编来写,所以单独写一个汇编文件naskfunc.na…...
建设网站需要的人员及资金/网红营销
极限的计算方法 一、初等函数: 1.limCC(C是常值函数);2.若 fx≤M(即fx是有界量),limα0(即α是无穷小量),⇒limfx⋅α0, 特别:fxC⇒limC⋅α0 ;3.若 fx≤…...
物流管理网站建设/新乡网站优化公司价格
1,Win7 ping 不存在的地址(请求超时) ip routing和no ip routing no ip routing----不查路由表不配置网关---arp-catch中存在很多条目(相当于static指出接口)配置网关--则会arp网关一次,有一个条目因为路由…...