动态代理 --java学习笔记

什么是动态代理?

当一个类的很多方法都存在重复冗杂的部分,就可以使用代理来处理那些重复部分的任务,到了各自的实现部分再丢回给原方法处理,同时也可以提高方法的扩展性,而动态则是指在运行时动态地创建代理对象,动态的调用方法

如何为Java对象创建一个代理对象?

java.lang.reflect.Proxy类:提供了为对象产生代理对象的方法:

代码演示动态代理的创建与使用:
Star接口:记录代理的方法

package com.zeyu.proxy;

public interface Star {
    String sing(String name);
    void dance();
}

原对象

package com.zeyu.proxy;

public class SuperStar implements Star{
    private String name;

    public SuperStar(String name){
        this.name = name;
    }

    public String sing(String name){
        System.out.println(this.name + "正在唱:" + name);
        return "谢谢大家!";
    }

    public void dance(){
        System.out.println(this.name + "正在跳舞~");
    }
}

代理

package com.zeyu.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    public static Star createProxy(SuperStar superStar) {
        /*
         * 参数一:用于指定一个类加载器
         * 参数二:指定生成的代理长什么样子,也就是有哪些方法
         * 参数三:用来指定生成的代理对象要感什么事情
         * */
        Star starProxy = (Star) Proxy.newProxyInstance(SuperStar.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {
            @Override   //回调方法
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /*
                * 三个形参:
                * proxy:动态生成的代理类
                * method:与代理类对象调用的方法相对应
                * args:当前method方法的参数
                * */
                //代理对象要做的事情,在这里写代码
                if (method.getName().equals("sing")) {
                    System.out.println("准备话筒,收钱20万");
                } else if (method.getName().equals("dance")) {
                    System.out.println("准备场地,收钱100万");
                }
                return method.invoke(superStar, args);

            }
        });
        return starProxy;
    }
}

测试类:

package com.zeyu.proxy;

public class Test {
    public static void main(String[] args) {
        SuperStar zeYu = new SuperStar("zeYu");
        Star proxy = ProxyUtil.createProxy(zeYu);

        String rs = proxy.sing("不为谁而作的歌");
        System.out.println(rs);

        proxy.dance();
    }
}

运行结果:

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

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

相关文章

【高德地图笔试题汇总】2024-04-11-高德地图春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新高德地图近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&…

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您

小伙伴朋友们: 此刻,我怀着无比激动与深深感激的心情,写下这篇特别的博文。今天,我的CSDN总访问量成功突破了百万大关,这不仅是一个数字的跨越,更是你们对我的支持、信任与鼓励的有力见证。在此&#xff0…

前端Vue自定义勾选协议组件的开发与应用

摘要: 随着前端技术的不断发展,用户体验成为了软件开发中的关键要素。在登录、注册等场景中,勾选协议是常见的需求。本文旨在介绍一款基于 Vue.js 的自定义勾选协议组件的开发与应用,该组件适用于多种场景,并且具备良…

图形学基础:二维三维刚体的移动、缩放和旋转矩阵

一、二维 1.1 缩放矩阵 x,y分别表示在x轴,y轴缩放的倍数 示例: 点(2,1)在x,y轴上分别缩放x倍,y倍 1.2 平移矩阵 x,y分表表示在x轴,y轴上移动的距离 示例:点(2,1&#xf…

C语言——指针的高级引用

目录 1.概述 2.虚拟内存空间 2.1存储期限 2.2栈区管理 2.3堆区域的使用 3.动态内存分配和释放(重点) 3.1通用指针类型void 3.2内存分配malloc函数 3.2.1 malloc函数(memory allocation)(注意len*size&#xff…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术,快速并智能地消除图像中的噪点,无论是亮度噪点还是颜色噪点,都能得到显著的改善。 软件下载:ON1 NoNoise AI …

【高项】信息化发展

目录 1.1 信息与信息化 1.1.1 信息 1.信息的定义 2.信息的特征与质量 1.1.2 信息系统 1.信息系统及其特性 2.信息系统生命周期 1.1.3 信息化 1.信息化内涵 2.信息化体系(口诀:上应下技左人右规,中资网) 1.2 现代化基础…

Vue笔记 2

数据代理 数据代理:通过一个对象代理对另一个对象中属性的操作(读/写) let obj{x:100} let obj2{y:200} Object.defineProperty(obj2,x,{get(){return obj.x},set(value){obj.x value} })Vue中的数据代理 Vue中的数据代理: 通…

【go从入门到精通】作用域,包详解

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C,go等语言开发经验,mysql,mongo,redis等数据库,设计模…

u盘为什么一插上电脑就蓝屏,u盘一插电脑就蓝屏

u盘之前还好好的,可以传输文件,使用正常,但是最近使用时却出现问题了。只要将u盘一插入电脑,电脑就显示蓝屏。u盘为什么一插上电脑就蓝屏呢?一般,导致的原因有以下几种。一,主板的SATA或IDE控制器驱动损坏或安装不当;二,电脑系统分区存在磁盘或文件故障错误;三,电脑中…

【力扣】125.验证回文串

刷题,过了真的好有成就感!!! 题解: 根据题目要求,我们需要处理一下几个问题: 将大写字母转变成小写对原来的字符串进行处理,只要字母和数字考虑只有一个和字符串为空的情况 1、将…

element-ui backtop 组件源码分享

今日简单分享 backtop 组件的源码实现,从以下三个方面: 1、backtop 组件页面结构 2、backtop 组件属性 3、backtop 组件事件 一、backtop 组件页面结构 二、backtop 组件属性 2.1 target 属性,触发滚动的对象,类型 string&am…

【保姆级讲解Nginx】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

【Linux系统编程】第一弹---背景介绍

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、Linux 背景介绍 1.1、发展史 1.1.1、UNIX发展的历史 1.1.2、Linux发展历史 2、开源精神 3、Linux内核官网 4、企业应用…

SAP SD学习笔记04 - 出荷Plant(交货工厂),出荷Point(装运点),输送计划,品目的可用性检查,一括纳入/分割纳入,仓库管理

上一章讲了SD的主数据。 SAP SD学习笔记03 - SD模块中的主数据-CSDN博客 本章讲出荷Plant(交货工厂),出荷Point(装运点)和出和路线。 还是偏理论多一些,后面的文章尽量多加些练习巩固一下。 1&#xff0…

2024年思维100春季线上比赛倒计时8天,来做做官方样题

今天是2024年4月12日,距离2024年春季思维100活动第一阶段的线上比赛4月20日还有8天。今年思维100活动的考试重点是什么呢?虽然主办方未公布,我们可以从主办方发布的参考题目中来推测今年的考试重点,并且按照这个来举一反三&#x…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享,在图像分类的任务上表现良好,具有很高的实践意义。 论文: https://arxiv.org/pdf/2109.15099.pdf项目: https://github.com/PaddlePaddle/Padd…

百科引流攻略|小马识途分享百科营销的五个技巧

纵观整个互联网领域,国内几大巨头百度、抖音、腾讯都布局了自身的百科平台,百科营销也始终作为网络营销一个重要分支而存在。很多人都知道百科营销是品牌背书的一把王牌,但很少有人提及百科营销的引流作用。 有人可能会说,百科词条…

K8S资源管理之计算资源管理

1.详解Requests和Limits参数 以CPU为例,下图显示了未设置Limits与设置了Requests和Limits的CPU使用率的区别 尽管Requests和Limits只能被设置到容器上,但是设置了Pod级别的Requests和Limits能大大提高管理Pod的便利性和灵活性,因此在Kubernet…

【RV1106的ISP使用记录之二】设备树的构建

基于MIPI接口的两种摄像头接入方式,理清楚各链路关系,方便后续的开发调试工作,先上一张图,后面再补充解释。