当前位置: 首页 > 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位版本解压后有目录如下 包含了动态库和静态…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

python打卡day49@浙大疏锦行

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...

python可视化:俄乌战争时间线关键节点与深层原因

俄乌战争时间线可视化分析&#xff1a;关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一&#xff0c;自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具&#xff0c;系统分析这场战争的时间线、关键节点及其背后的深层原因&#xff0c;全面…...

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…...