动态代理(黑马笔记)

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

在这里插入图片描述
一、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 "谢谢";
    }
    //跳舞
    @Override
    public 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 {
    //我们可以把所有想要被代理的方法定义在接口当中
    //唱歌,因为在接口里都是抽象方法,所以方法体去掉,前面加abstra
    public 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() {
                    @Override
                    public 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. 获取代理的对象 proxy
        BigStar bigStar = new BigStar("鸡哥");
        Star proxy = ProxyUtil.createProxy(bigStar);//Ctrl+alt+v  自动生成左边
        //2. 调用唱歌的方法
        String result = proxy.sing("只因你太美");
        System.out.println(result);//给谢谢返回值做打印
        //3. 调用跳舞的方法
        proxy.dance();//无参,无返回值,所以小括号里不需要带任何东西,在方法左边也不需要变量进行接收.
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙应用实现音效播放

一、问题背景&#xff1a; 应用在强提醒场景下&#xff0c;一般会有播放音效的效果&#xff0c;提示用户注意力的关注。 比如消息提醒&#xff0c;扫码提示&#xff0c;删除键确认提示等。 在鸿蒙应用如何实现音效播放呢&#xff1f; 二、解决方案&#xff1a; 使用AVPlaye…

园区运营管理平台的功能架构

产业园区作为推动地方经济发展的重要载体&#xff0c;其运营管理水平直接影响到园区的竞争力和可持续发展能力&#xff0c;园区运营管理平台作为园区的运营管理工具&#xff0c;旨在通过智能化、自动化的手段提升园区的运营效率和服务水平。 园区运营管理平台不仅为园区管理者提…

45-3 护网溯源 - 为什么要做溯源工作

官网:CVERC-国家计算机病毒应急处理中心 西工大遭网络攻击再曝细节!13名攻击者身份查明→ (baidu.com) 护网溯源是指通过技术手段追踪网络攻击的来源和行为,其重要性体现在以下几个方面: 安全防御:了解攻击源头可以帮助组织加强网络安全防御,及时采取措施防止攻击的再次…

A股冲高回落,金属、地产板块领跌,新股N汇成真首日暴涨753%

行情概述 AH股有色金属、教育及地产板块领跌&#xff0c;军工航天及半导体板块逆势走强&#xff1b;锂电池、创新药概念股也走强。创业板新股N汇成真首日暴涨753%&#xff0c;触发二次临停。 周三A股冲高回落&#xff0c;上证指数收跌0.83%&#xff0c;深成指跌0.8%&#xff…

爬楼梯——动态规划第一步

本问题其实常规解法可以分成多个子问题&#xff0c;爬第 n 阶楼梯的方法数量&#xff0c;等于两个部分之和 爬上 n−1 阶楼梯的方法数量。因为再爬 1 阶就能到第 n 阶爬上 n−2 阶楼梯的方法数量&#xff0c;因为再爬 2 阶就能到第 n 阶 所以我们得到公式 dp[n] dp[n−1] d…

Windows下Qt5.14.2连接华为IoTDA平台

一、华为IoTDA简介 华为云物联网平台&#xff08;IoT 设备接入云服务&#xff09;提供海量设备的接入和管理能力&#xff0c;将物理设备联接到云&#xff0c;支撑设备数据采集上云和云端下发命令给设备进行远程控制&#xff0c;配合华为云其他产品&#xff0c;帮助您快速构筑物…

力扣200. 岛屿数量(BFS)

Problem: 200. 岛屿数量 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义方向数组&#xff1a;定义一个方向数组 DIRECTIONS&#xff0c;表示上、下、左、右四个方向的移动。 2.获取网格的行数和列数同时初始化一个计数器 numIslands 用于记录岛屿的数量。 …

【新书上市】图像画质算法与底层视觉技术

图书主页&#xff1a;https://book.douban.com/subject/36895899/ 购买链接&#xff1a;https://item.jd.com/10105601481762.html 内容介绍 本书主要介绍了图像画质相关的各类底层视觉任务及其相关算法&#xff0c;重点讲解了去噪、超分辨率、去雾、高动态范围、图像合成与图…

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层&#xff08;无线局域网&#xff09; 什么是无线局域网IEEE 802.11主要标准及其特点&#xff1a; 802.11的MAC帧样式 我们来看看无线局域网&#xff1a; 什么是无线局域网 无线局域网&#xff08;Wireless Local Area Network&#xff0c;简称WLAN…

LLM之RAG实战(三十九)| 高级RAG技术全面解析(附代码)

一、高级RAG概述 基本 RAG 的工作流程可分为三个步骤&#xff1a;索引、检索和生成。在索引阶段&#xff0c;文本被转换为嵌入&#xff0c;然后存储在向量数据库中以创建可搜索的索引。在检索步骤中&#xff0c;用户的查询也被转换为嵌入&#xff0c;此嵌入用于在向量数据库中搜…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的&#xff0c;包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误&#xff1a;如果模型在导入或创建时材质没有正确加载或设置&…

力扣 54.螺旋矩阵

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#…

[SaaS] AI+数据,tiktok选品,找达人,看广告数据

TK观察专访丨前阿里“鲁班”创始人用AIGC赋能TikTok获千万融资用AI数据做TikTokhttps://mp.weixin.qq.com/s/xp5UM3ROo48DK4jS9UBMuQ主要还是爬虫做数据的。 商家做内容&#xff1a;1.找达人拍内容&#xff0c;2.商家自己做原生自制内容&#xff0c;3.广告内容。 短视频&…

MariaDB数据导入与导出操作演示

文章目录 整个数据库导出导入先删除库然后再导入 参考这里&#xff1a; MariaDB数据库导出导入. 整个数据库 该部分演示&#xff1a;导出数据库&#xff0c;然后重建数据库&#xff0c;并导入数据的整个过程。 导出 Win R &#xff0c;打开运行输入cmd并回车&#xff0c;然…

chatglm3-6b小试

原本想在VMware中装个unbutu&#xff0c;再搞chatglm&#xff0c;但经过调研发现业内都是采用双系统来搞chat的开发。于是只好用rufus制作了一个ubuntu22.04的系统盘&#xff0c;你需要准备8G&#xff0c;因为制作好镜像后是7个多G。安装这里就不说了。 1 ubuntu环境 安装好ubu…

python基础篇(2):字符串扩展知识点

1 字符串的三种定义方式 字符串在Python中有多种定义形式&#xff1a; &#xff08;1&#xff09;单引号定义法 name 博主帅绝上下五千年 print(name) print(type(name)) 效果如下&#xff1a; &#xff08;2&#xff09;双引号定义法 name "博主帅绝上下五千年&qu…

CUDA12.0 + cuDNN9.0.0安装

目录 1. 查看显卡支持的CUDA版本1.1 指令查看1.2 控制面板查看 2. 安装CUDA2.1 下载2.2 安装2.3 验证 3. 安装cuDNN3.1 下载3.2 安装3.2 验证 1. 查看显卡支持的CUDA版本 1.1 指令查看 打开cmd输入nvidia-smiDriver Version表示显卡驱动版本&#xff0c;CUDA Version表示支持…

【AndroidStudio旧版本BUG问题】完美解决运行报错问题Invalid keystore format

由于之前安装的版本导致AndroidStudio 运行报错&#xff1a;Invalid keystore format 在如下截图的路径中删了debug.keystore重新打开Android Studio运行一下就好了&#xff01;&#xff01;&#xff01; 下面介绍各个模块功能&#xff1a; adbkey 是 Android Debug Bridge (AD…

【数据库】SQL--DQL(初阶)

文章目录 DCL1. 基本介绍2. 语法2.1 基础查询2.2 条件查询2.3 聚合函数2.4 聚合查询2.5 分组查询2.6 排序查询2.7 分页查询2.8 综合案例练习2.9 执行顺序 3. DQL总结 DCL 更多数据库MySQL系统内容就在以下专栏&#xff1a; 专栏链接&#xff1a;数据库MySQL 1. 基本介绍 DQL英…

Linux下SpringBoot项目部署(centos系统)

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…