当前位置: 首页 > news >正文

jdk动态代理

jdk动态代理:基于反射动态生成代理对象

pwp动态代理的步骤比较复杂,无需特别深入的理解,在jdk中固定的步骤,只需要知道这些步骤即可,不必钻牛角尖

动态代理涉及到的三个反射包类

  1. InvocationHandler
  2. Method
  3. Proxy

1. InvocationHandler接口(调用处理器)

就一个invoke()方法,表示代理对象要执行的功能代码。你的代理类要完成的功能就写在invoke方法中
参数:
Object proxy:jdk创建的代理对象,无需赋值。
Method method:目标类中的方法,jdk提供的method对象。
Object[ ] args:目标类中方法的参数,jdk提供的。

2、Method类

表示方法的,确切的说 就是目标类中的方法。
作用:通过Method可以执行某个目标类中的方法,Method.invoke();

Method.invoke(目标对象,方法的参数);
Object res = method.invoke(target, “刘龙”);//这里不需要指定方法的名称,jdk会帮我们寻找

说明:Method.invoke();就是帮我们指定目标方法的,代替目标方法的执行,等同于静态代理中的使用目标类调用方法。

//创建接口
public interface sell {void sellcart(String name);
}
//创建接口实现类
public class railway implements sell {@Overridepublic void sellcart(String name) {System.out.println(name+"在火车站出售了火车票--------");}
}
public class TestApp {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//使用反射机制执行sellcart方法,核心Method(类中的方法)sell target = new railway();//获取sellcart名称对应的Method类对象Method method = sell.class.getMethod("sellcart", String.class);//通过Method可以执行 sellcart方法调用/*** invoke是Method类中的一个方法。表示执行方法的调用* 参数:* 1、Object 表示对象的,要执行这个对象的方法* 2、Object...args、方法执行时的参数值返回值:Object:方法执行后的返回值*///表达的意思就是,执行target对象的sellcart方法,参数是刘龙Object res = method.invoke(target, "刘龙");//执行代理方法}
}

3、 Proxy类

动态代理的核心对象,创建代理对象。之前创建对象都是new类的构造方法(),现在我们是使用Proxy类的方法,代替new的使用。

方法:静态方法newProxyInstance()
作用是:创建代理对象,等同于静态代理中的TaoBao tao = new TaoBao();
参数:
1.ClassLoader loader类加载器:

负责向内存中加载对象的。使用反射获取对象的CladdLoader。例如类A a.getClass().getClassLoader(),目标对象的类加载器

2.Class<?>[] interfaces:接口,
目标对象实现的接口,也是反射获取的

3.InvocationHandler h:我们自己写的,代理类要完成的功能。
返回值:就是代理对象

实现动态代理的步骤

1.创建接口,定义目标类要完成的功能
2.创建目标类实现接口
3.创建InvocationHandler 接口的实现类,在invoke方法中完成代理类的功能
(1)调用目标方法
(2)增强功能
4.使用Proxy类的静态方法,创建代理对象。并把返回值转为接口类型

相关文章:

jdk动态代理

jdk动态代理:基于反射动态生成代理对象 pwp动态代理的步骤比较复杂&#xff0c;无需特别深入的理解&#xff0c;在jdk中固定的步骤&#xff0c;只需要知道这些步骤即可&#xff0c;不必钻牛角尖 动态代理涉及到的三个反射包类 InvocationHandlerMethodProxy 1. InvocationHand…...

备忘录模式

备忘录模式 备忘录模式定义使用场景1、撤销操作&#xff1a;2、游戏进度保存&#xff1a;3、定时器&#xff1a;4、浏览器历史记录&#xff1a;5、购物车状态保存&#xff1a;6、场景总结 角色定义Originator 发起人角色:Memento 备忘录角色:Caretaker 备忘灵管理员角色:需求背…...

问题解决:跨域访问错误

今天做前端页面渲染的时候遇到一个问题, 因为我使用的wsl开发,windows直接访问不了wsl中的文件,还要改其他配置没成功,索性就不改了,粘贴在桌面上用浏览器打开调试 然后所有使用apifox通过测试的路径全部报错 Ensure CORS response header values are validA cross-origin reso…...

程序员应该怎么自学才能入门 ?我来聊聊自己的经历

当你想成为一名程序员&#xff0c;如何自学入门是一个非常重要的问题。在这里我分享一下我的经验&#xff0c;希望能对你有所帮助。 首先&#xff0c;为了制定好你的学习路线&#xff0c;你可以在网上的培训机构网站找到一张基础路线图。这张路线图必须是跟行业对标的&#xf…...

听我一句劝,别去外包,干了6年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…...

leetcode 88 合并两个有序数组

题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&am…...

软件项目成本控制的5大关键点 不得不重视

软件项目成本一般分为运营成本和项目成本。而运营成本比较固定&#xff0c;压缩和削减的余地不大。而在项目成本中&#xff0c;最主要的成本是人工成本。那么如何提高项目开发效率&#xff0c;节约人工成本&#xff0c;对成本管理至关重要。 我们从以下几个影响项目成本的主要因…...

CSS样式更改:边框Border的另类用法

CSS样式更改——字体设置Font&边框Border 随着互联网技术的不断发展&#xff0c;网页设计已经成为了一项非常重要的工作。在网页设计中&#xff0c;字体设置和边框Border是两个非常常见的CSS样式&#xff0c;可以通过这两个样式对网页的外观进行设置。下面&#xff0c;我们…...

shell的灵活运用 (函数,关联数组,循环,awk,sed等)

题目 提示&#xff1a;没有基础请先看看基础部分的讲解&#xff0c;否则看不懂 1&#xff0c;编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 代码&#xff1a; #bash/bin function a() {b$# #判断传入的参数个数 # echo $b…...

大疆无人机 MobileSDK(遥控器/手机端)开发 v4版<1>

大疆无人机飞控开发 大疆无人机SDK开发包功能概述飞行控制相机实时视频流传感器数据下载媒体文件遥控器&#xff0c;电池和无线链路连接应用程序和产品 v4版sdk 二次开发注册成为DJI开发者生成 App KeyAndroid 示例代码配置Android Studio项目集成创建一个新的应用配置Gradle 脚…...

mysql数据库之事务

1.事务的概念 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个 整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么都执行&#xff0c;要么都不执行。 事务是一个不可分割的工作逻辑单元&#xf…...

安装运行Hyperf

安装运行Hyperf 上回讲到&#xff0c;我们对一个普通的 Laravel 框架进行了改造&#xff0c;让它可以在 Swoole 环境下使用&#xff0c;不过其中会有很多问题可能我们一时考虑不到&#xff0c;就会造成程序的稳定性出现问题。那么&#xff0c;今天我们就来学习一个原生的 Swoo…...

回收站文件恢复,分享4个巧妙解决方法!

案例&#xff1a;回收站文件怎么恢复 【清理电脑时一不小心清空了我的回收站&#xff0c;有朋友知道该怎么恢复吗&#xff1f;急急急&#xff01;】 回收站对于电脑用户来说&#xff0c;可以带来很多的方便&#xff0c;能让用户能够在删除文件后将其恢复。但是&#xff0c;有…...

CTF权威指南 笔记 -第三章汇编基础-3.2-x86/x64汇编基础

这节介绍PC最常见的架构 x86和扩展 x64框架 CPU操作模式 对x86处理器而言 有三个最主要的保护模式 保护模式 实地址模式 系统管理模式还有一个保护模式的子模式 虚拟8086模式 保护模式 保护模式是处理原生状态 这个时候所有指令和特性都是可以使用的 分配给程序的独立内…...

争夺汽车芯片「高地」

一直以来&#xff0c;汽车芯片无论是工艺制程&#xff0c;还是新技术的导入&#xff0c;都要落后消费类产品几年时间。不过&#xff0c;如今&#xff0c;随着汽车智能化进一步推动汽车制造商与上游芯片设计公司、晶圆代工厂的紧密互动&#xff0c;历史即将翻篇。 同时&#xf…...

SuperMap GIS基础产品三维GIS FAQ集锦(2)

SuperMap GIS基础产品三维GIS FAQ集锦&#xff08;2&#xff09; 【WebGL】桌面对三维缓存设置了最大最小可见高度&#xff0c;在iServer发布三维服务并进行预览是可以看到该效果的&#xff0c;但在前端代码打开该服务&#xff0c;最大最小可见高度效果丢失&#xff0c;请问怎…...

11.streamFile

1.Stream流 1.1体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存储到一个新的集合遍历上一步得到的集…...

如何裁剪图片大小尺寸?

如何裁剪图片大小尺寸&#xff1f;平时我们在工作或者学习的时候&#xff0c;会经常需要将图片上传到不同的网站或者平台上&#xff0c;然而上传的时候经常会受到尺寸的限制&#xff0c;有时候尺寸太大就需要变小&#xff0c;为了确保上传成功&#xff0c;我们需要将图片进行裁…...

深度学习笔记之梯度下降、反向传播与内置优化器

文章目录 1. 梯度下降法2. 反向传播算法3. PyTorch内置的优化器3.1 SGD优化器3.2 RMSprop优化器3.3 Adam优化器 1. 梯度下降法 笔者往期的机器学习笔记&#xff1a; 机器学习之梯度下降算法 梯度下降法是一种致力于找到函数极值点的算法。 所谓“训练”或“学习”就是改进…...

Visual Studio 2022 搭建GLFW OpenGL开发环境

最近工作需要 需要写一个全景的视频播放器 网上搜了下大概解决方案是 ffmpegopengl b站有很多视频 按照视频 搭建了OpenGL的开发环境 先去GLFW的网站下载 windows平台的库文件 为什么使用GLFW 因为GLFW是跨平台的 我下的是64位版本解压后有目录如下 包含了动态库和静态…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...