java中的动态代理机制

news/2024/7/5 4:06:12

目录

什么是动态代理?

为什么需要代理?

代理长什么样子?

代码样例


什么是动态代理?

动态代理可以无侵入式的给代码增加功能

为什么需要代理?

对象如果嫌弃身上的事情太多,就可以通过代理来转移部分的职责

代理长什么样子?

对象有什么方法 想被代理,代理就一定要有相应的方法

代理是通过接口来知道对象想代理什么方法的,代理和对象都要实现接口才行

代码样例

先定一个要进行代理的类


/**
 * 大明星
 *
 * @author 小如
 * @date 2023/07/26
 */
public class BigStar implements Star{
    private String name;
    public BigStar(String name){
        this.name = name;
    }
    @Override
    public String sing(String name){
        System.out.println(this.name+"正在唱"+name);
        return "谢谢";
    }
    @Override
    public String dance(){
        System.out.println(this.name+"正在跳舞");
        return "谢谢";
    }
    public void rop(){
        System.out.println(this.name+"正在唱rop");
    }
    public void basketball(){
        System.out.println("打篮球");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "BigStar{" +
                "name='" + name + '\'' +
                '}';
    }
}

定义接口将想要代理的方法传过去


public interface Star {
    /**
     * 唱
     *
     * @param name 名字
     * @return {@link String}
     */
    String sing(String name);

    /**
     * 跳舞
     *
     * @return {@link String}
     */
    String dance();
}

创建代理类

    public static Star cteateProxy(BigStar bigStar){
        Star star = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if(method.getName().equals("sing")){
                            System.out.println("准备话筒,收钱");
                        }
                        if (method.getName().equals("dance")){
                            System.out.println("准备场地,收钱");
                        }

                        return method.invoke(bigStar,args);
                    }
                }

        );
        return star;
    }
}

测试代理

public class Test {
    public static void main(String[] args) {
        BigStar bigStar = new BigStar("锅锅");
        Star proxy = ProxyUtil.cteateProxy(bigStar);
        String sing = proxy.sing("只因你太美");
        System.out.println(sing);
    }
}

运行结果

 


http://lihuaxi.xjx100.cn/news/1375198.html

相关文章

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx 方法一、检查配置设置 下图中三个方框圈出来的地方设置为自己的下载的maven地址,配置文件地址,仓库地址。刷新maven。 我个人试过没用,不过网上有的朋友用这个方法解决了。 …

c++解析 一行字符串输入、 java大整数模板

nums [1,3,-1,-3,5,3,6,7], k 3将上述输入转换为c的输入 vector<int> split(const string& str, char sep) {vector<int> tokens;int i;stringstream ss(str);while (ss >> i) {tokens.push_back(i);if (ss.peek() sep) {ss.ignore();}}return tokens…

ROS noetic,ROS melodic 安装 MoveIt 并运行

ROS noetic&#xff0c;ROS melodic 安装 MoveIt 并运行 前言更新功能包版本下载依赖文件创建工作区和软件源下载源代码安装编译器缓存&#xff08;可选环节&#xff09;编译Moveit&#xff01;安装Moveit&#xff01;检测是否安装成功 前言 在安装过程中我也碰壁过很多次&…

RecyclerView 一次性加载大量数据时(2000条音频数据),导致UI线程卡顿,频繁GC的问题

问题描述&#xff1a; 公司项目有这么一个需求&#xff0c;扫描sdCard或U盘的音频数据&#xff0c;并分类展示出来&#xff0c;当数据量比较大时&#xff08;2000多条数据以上&#xff09;&#xff0c;显示列表慢和滑动列表会很卡。 问题的寻找过程&#xff1a; 当时想的就是…

spring6——概述

文章目录 概述Spring 是什么&#xff1f;Spring 的狭义与广义Spring Framework特点Spring模块组成 概述 Spring 是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 J…

利用FME实现批量提取图斑特征点、关键界址点提取、图斑拐点抽稀,解决出界址点成果表时点数过多问题的方法

目录 一、实现效果 二、实现过程 1.提取图斑界址点 2.计算各界址点的角度 3.筛选提取关键界址点 三、总结 对于范围较大的图斑&#xff0c;界址点数目较大&#xff0c;在出界址点成果表前&#xff0c;往往需要对界址点进行处理&#xff0c;提取出关键特征点作为出界址点成…

SIGIR 2023 | 语音让对话推荐更easy,火山语音联合新加坡科学研究院发布业内首个语音对话推荐数据集

近年来&#xff0c;推荐系统在工业界取得了巨大成功&#xff0c;甚至成为互联网发展中不可或缺的增长引擎&#xff0c;基于此研究者们也在积极探索推荐系统的新形态&#xff0c;其中对话推荐系统&#xff08;Conversational Recommender System&#xff0c;简称CRS&#xff09;…

利用 trait 实现多态

我在书上看到基于 std::io::Write 的示例&#xff0c;它是一个 trait 类型&#xff0c;内部声明了一些方法。和 go 语言不同&#xff0c;rust 中类型必须明确实现 trait 类型&#xff0c;而 go 语言属于 duck 模式。 std::io::Write下面的例子中调用 write_all 方式来演示&…