动态代理(黑马笔记)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
一、BigStar 大明星类

package com.itheima.mydynamicproxy1;
public class BigStar implements Star {//实现接口要重写里边的抽象方法private String name;public BigStar() {}public BigStar(String name) {this.name = name;}//唱歌@Override  //表示重写接口中的方法public String sing(String name){System.out.println(this.name + "正在唱" + name);return "谢谢";}//跳舞@Overridepublic void dance(){System.out.println(this.name + "正在跳舞");/*** 在Java代码中,this关键字用于指代当前对象实例。因此this.name指的是当前BigStar类实例的name属性。* 当一个方法内部引用了与参数同名的成员变量时,使用this关键字可以明确地区分它们,* 表明你正在访问的是属于当前对象的成员变量name,而不是传递给方法的局部变量name。* 所以,表达式(this.name + "正在唱" + name)的意思:* 是将当前BigStar对象的name属性值与字符串"正在唱"以及传递给sing方法的参数name(即歌曲名)拼接起来,* 形成一个完整的句子,例如如果BigStar对象的name是"小明",调用sing("月亮代表我的心")时,* 输出将会是"小明正在唱月亮代表我的心"。*/}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}public String toString() {return "BigStar{name = " + name + "}";}
}

二、Star接口,代理类和大明星类都要实现这个接口以获取代理的方法。

package com.itheima.mydynamicproxy1;
public interface Star {//我们可以把所有想要被代理的方法定义在接口当中//唱歌,因为在接口里都是抽象方法,所以方法体去掉,前面加abstrapublic abstract String sing(String name);//跳舞public abstract void dance();
}

三、 ProxyUtil 代理类

package com.itheima.mydynamicproxy1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/** 类的作用:创建一个代理* */
public class ProxyUtil {/** 方法的作用:给一个明星的对象,创建一个代理*  形参:被代理的明星对象*  返回值:给明星创建的代理* 在外界获取代理对象后,方法的调用是怎么样的 需求:*   外面的人想要大明星唱一首歌*   1. 获取代理的对象*      代理对象 = ProxyUtil.createProxy(大明星的对象);*   2. 再调用代理的唱歌方法*      代理对象.唱歌的方法("只因你太美");* *///首先要把明星的对象作为参数传过来,我才能给它创建代理//方法的返回值,就是我们创建的代理,// 所以这里类型可以写Star,因为代理ProxyUtil类 也是要实现Star这个接口的,// 所以在这直接写接口的类型是ok的.public static Star createProxy(BigStar bigStar) {/* java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)参数一:用于指定用哪个类加载器,去加载生成的代理类参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法,参数三:用来指定生成的代理对象要干什么事情*方法体用到了上述方法 */Star star = (Star) Proxy.newProxyInstance(//创建出来的是代理对象,看原方法中返回类型是Object的,但是在左边用Star来接收,所以要强转一下ProxyUtil.class.getClassLoader(),//参数一:用于指定用哪个类加载器,去加载生成的代理类// (相当于找到是谁把当前类的字节码文件加载到内存的,找到这个类加载器后,让它再去加载当前的代理到内存当中)new Class[]{Star.class},//参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法,//代码中是以数组的方式来体现的,数组中的参数都是字节码,(把接口的字节码放在数组当中)// new Class[]{Star.class},表示生成的代理中介,它可以代理Star这个接口里所有的方法,说白了能代理的方法都在接口当中.//如果接口有多个,可以把它们都写在数组当中new Class[]{Star.class,A.class,B.class}//参数三:用来指定生成的代理对象要干什么事情,通过实现InvocationHandler接口来实现,// 因为代理对象要实现Star接口,所以这里要实现InvocationHandler接口,//InvocationHandler是接口,因此这里要写一个InvocationHandler实现类的对象,这里用匿名内部类来做,new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/** 参数一:代理的对象* 参数二:要运行的方法 sing* 参数三:调用sing方法时,传递的实参,因为invoke方法就是代理要干的事情*/if ("sing".equals(method.getName())) {System.out.println("准备话筒,收钱");} else if ("dance".equals(method.getName())) {System.out.println("准备场地,收钱");}//去找大明星开始唱歌或者跳舞//代码的表现形式:调用大明星里面唱歌或者跳舞的方法return method.invoke(bigStar, args);//反射的反射机制,通过反射调用bigStar里面的方法,这里的args是“只因你太美”//在调用方法时,如果有参数,要将参数传递过去.//如果方法有返回值,可以将它的运行结果进行返回}});return star;//返回生成的代理}
}//什么是类加载器? (就是Java在运行时,需要有一个人将那个字节码文件加载到内存中,就是类加载器去加载的)
// 类加载器:负责把一个类的字节码加载到内存中,并且生成一个Class对象.
/** 1. 获取类加载器*   1.1 获取系统类加载器*       ClassLoader cl = ClassLoader.getSystemClassLoader();*   1.2 获取系统类加载器的父类加载器*       ClassLoader cl = ClassLoader.getSystemClassLoader().getParent();*   1.3 获取扩展类加载器*       ClassLoader cl = ClassLoader.getSystemClassLoader().getParent().getParent();*   1.4 获取应用程序类加载器*       ClassLoader cl = ClassLoader.getSystemClassLoader().getParent().getParent().getParent();*/

四、测试类

package com.itheima.mydynamicproxy1;public class Test {public static void main(String[] args) {/*需求:外面的人想要大明星唱一首歌1. 获取代理的对象代理对象 = ProxyUtil.createProxy(大明星的对象);2. 再调用代理的唱歌方法代理对象.唱歌的方法("只因你太美");*///1. 获取代理的对象 proxyBigStar bigStar = new BigStar("鸡哥");Star proxy = ProxyUtil.createProxy(bigStar);//Ctrl+alt+v  自动生成左边//2. 调用唱歌的方法String result = proxy.sing("只因你太美");System.out.println(result);//给谢谢返回值做打印//3. 调用跳舞的方法proxy.dance();//无参,无返回值,所以小括号里不需要带任何东西,在方法左边也不需要变量进行接收.}
}

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

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

相关文章

Java | Leetcode Java题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; class Solution {Map<String, Integer> wordId new HashMap<String, Integer>();List<List<Integer>> edge new ArrayList<List<Integer>>();int nodeNum 0;public int ladderLength(String beginW…

算法-找出N个数组的共同元素

一、代码与执行结果 财经新闻是大众了解金融事件的重要渠道&#xff0c;现有N位编辑&#xff0c;分别对K篇新闻进行专业的编辑与排版。需要您找出被这N位编辑共同编辑过的新闻&#xff0c;并根据这些新闻ID升序排列返回一个数组。 import random# 查找编辑共同处理的新闻id def…

RunLoop小白入门

核心概念 什么是 RunLoop ? RunLoop 是 iOS 和 macOS 应用程序框架中的一个核心概念&#xff0c;用于管理线程的事件处理。它可以看作是一个循环&#xff0c;用于持续接收和处理各种事件&#xff0c;如用户输入、定时器、网络事件等。RunLoop 在保持应用程序响应用户交互和系…

系统与软件工程软件测试过程

系统与软件工程 软件测试 测试过程 &#xff1b;对应的国标是GB/T 38634.4 2020 &#xff0c;该标准的范围规定适应用于治理、管理和实施任何组织,项目或较小规模测试活动的软件测试的测试过程,定义了软件测试通用过程,给出了描述过程的支持信息图表。 一 术语和定义 1.1实测…

力扣173题:二叉搜索树迭代器(含模拟面试)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 关注微信公众号 数据分析螺丝钉 免费领取价值万元的python/java/商业…

Luminus推出新型高性能 UV-A LED

​Luminus Devices推出的SST-08H-UV&#xff0c;作为SST-08-UV的升级版&#xff0c;以其独特的高功率UV-A LED系列&#xff0c;犹如一道璀璨的光束&#xff0c;照亮了众多领域。这款LED的卓越之处在于&#xff0c;它巧妙地利用了365nm、385nm、395nm和405nm的峰值波长选项&…

使用System-Verilog实现FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、实验原理1.1 传感器概述&#xff1a;1.2 传感器引脚1.3 传感器工作原理1.4 整体测距原理及编写思路 二、System-Verilog文件2.1 时钟分频&#xff08;1&#xff09;clk_div.sv2.2 超声波测距&#xff08;1&#xff09;hc_sr_trig.sv&#xff08;2&#xff09;…

汽车数据应用构想(二)

一直说数据价值场景&#xff0c;啥叫有价值&#xff1f;啥样的场景有价值&#xff1f;按互联网的价值观来看&#xff0c;用户的高频需求就是价值。用户也许不会付费&#xff0c;但只要他天天用&#xff0c;那就是流量&#xff0c;就是用户黏性&#xff0c;就是价值&#xff01;…

阿贝云:免费虚拟主机和免费云服务器评测

阿贝云是一家知名的云服务提供商&#xff0c;提供免费虚拟主机和免费云服务器等服务。在今天的评测中&#xff0c;我们将对阿贝云的免费虚拟主机和免费云服务器进行详细的试用和评测。 首先&#xff0c;让我们来看看阿贝云的免费虚拟主机服务。阿贝云的免费虚拟主机提供稳定可靠…

方法重写

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 基类的成员都会被派生类继承&#xff0c;当基类中的某个方法不完全适用于派生类时&#xff0c;就需要在派生类中重写父类的这个方法&#xff0c;这和…

HALCON飞拍贴片机框架程序——硬件介绍

本专栏主要讲解三头贴片机框架程序&#xff0c;包括硬件介绍和软件代码。硬件主要为视觉部分&#xff0c;软件为视觉检测代码部分。贴片机的机械硬件不做介绍。 具体设备运行视频可以搜索博主抖Y&#xff1a;“伶俐科技”观看。 贴片机硬件如下图分为三个部分&#xff0c;第一…

网络安全等级保护,三级等保技术建议书(word原件获取)

1信息系统详细设计方案 1.1安全建设需求分析 1.1.1网络结构安全 1.1.2边界安全风险与需求分析 1.1.3运维风险需求分析 1.1.4关键服务器管理风险分析 1.1.5关键服务器用户操作管理风险分析 1.1.6数据库敏感数据运维风险分析 1.1.7“人机”运维操作行为风险综合分析 1.2…

详解 Spark核心编程之广播变量

广播变量是分布式共享只读变量 一、广播变量功能 ​ 广播变量用来将一个较大的数据对象发送到 Executor 并保存在内存中&#xff0c;同一个 Executor 中的所有 Task 都可以读取且只能读取广播变量中的数据&#xff0c;从而达到共享的目的&#xff0c;避免 Executor 中存在大量…

大语言模型技术系列讲解:大模型应用了哪些技术

为了弄懂大语言模型原理和技术细节&#xff0c;笔者计划展开系列学习&#xff0c;并将所学内容从简单到复杂的过程给大家做分享&#xff0c;希望能够体系化的认识大模型技术的内涵。本篇文章作为第一讲&#xff0c;先列出大模型使用到了哪些技术&#xff0c;目的在于对大模型使…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

kotlin1.8.10问题导致gson报错TypeToken type argument must not contain a type variable

书接上回&#xff0c;https://blog.csdn.net/jzlhll123/article/details/139302991。 之前我发现gson报错后&#xff1a; gson在2.11.0给我的kotlin项目代码报错了。 IllegalArgumentException: TypeToken type argument must not contain a type variable 上次解释原因是因为&…

String常用操作

String常用方法 构造字符串 常用的构造字符串有3种&#xff1a; 1.直接赋值String s "abcd"; 2.实例化调用构造方法String s new String("abcd"); 3.实例化传字符数组 char[] ch {a,b,c,d}; String s new String(ch);字符串比较 比较 比较的是两个…

35【Aseprite 作图】苹果——拆解

1 叶子是&#xff0c;竖着4&#xff0c;然后2 1 竖2&#xff1b;左边是1 2 横着2&#xff1b;然后横着连接 之后画苹果&#xff0c;4 3 1 1 1 &#xff0c;竖着8 2 1 1 1 2 横着5&#xff1b;之后水平翻转&#xff08;苹果左右一样&#xff09; 2 加上浅绿做底色 3 阴影部分 …

C语言 | Leetcode C语言题解之第128题最长连续序列

题目&#xff1a; 题解&#xff1a; typedef struct {int key;UT_hash_handle hh; }Hash; int longestConsecutive(int* nums, int numsSize) {Hash* headNULL;Hash* tempNULL;for(int i0;i<numsSize;i){int numnums[i];HASH_FIND_INT(head,&num,temp);if(!temp){temp…

HCIP的学习(27)

RSTP—802.1W—快速生成树协议 STP缺陷&#xff1a; 1、收敛速度慢----STP的算法是一种被动的算法&#xff0c;依赖于计时器来进行状态变化 2、链路利用率低​ RSTP向下兼容STP协议。&#xff08;STP不兼容RSTP&#xff09; 改进点1—端口角色 802.1D协议---根端口、指定端口…