首页 > 其他分享 >动态代理学习记录

动态代理学习记录

时间:2024-06-06 20:00:02浏览次数:22  
标签:star 记录 void 经纪人 代理 println 动态 public

目录

1.代理模式

  • Java动态代理与设计模式中的代理模式有关,什么是代理模式呢?

代理模式:给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。

  • 代理模式有什么用?

作用:通过代理可以控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即: AOP的微观实现!)

  • 核心角色
  1. 抽象角色(接口):定义公共对外方法

  2. 真实角色(周杰伦):实现抽象角色,定义真实角色所要实现的业务逻辑

  3. 代理角色(代理人):实现抽象角色,是真实角色的代理,通过调用真实角色的方法来完成业务逻辑,并可以附加自己的操作
    代理

2.静态代理

先通过实例来学习静态代理,然后理解静态代理的缺点,再来学习本文主角:动态代理

编写一个接口 Star ,以及该接口的一个实现类 RealStar

  • 抽象角色:Star接口
public interface Star {
	/**
	 * 面谈
	 */
	void confer();
	/**
	 * 签合同
	 */
	void signContract();
	/**
	 * 订票
	 */
	void bookTicket();
	/**
	 * 唱歌
	 */
	void sing();
	/**
	 * 收钱
	 */
	void collectMoney();
}
  • 真实角色:RealStar实现类
public class RealStar implements Star {

	public void bookTicket() {

	}

	public void collectMoney() {

	}

	public void confer() {

	}

	public void signContract() {

	}

	public void sing() {
		System.out.println("周杰伦:唱兰亭序");
	}
}
  • 代理角色:ProxyStar
public class ProxyStar implements Star {
	
	private Star star;
	
	public ProxyStar(Star star) {
		super();
		this.star = star;
	}

	public void bookTicket() {
		System.out.println("经纪人:定机票");
	}

	public void collectMoney() {
		System.out.println("经纪人:收尾款");
	}

	public void confer() {
		System.out.println("经纪人:面谈");
	}

	public void signContract() {
		System.out.println("经纪人:签合同");
	}

	public void sing() {
		star.sing();
	}
}
  • 客户端测试
public class Client {
	public static void main(String[] args) {
		Star proxy = new ProxyStar(new RealStar());
		
		proxy.confer();
		proxy.signContract();
		proxy.bookTicket();
		proxy.sing();
		
		proxy.collectMoney();
		
	}
}
  • 运行结果
经纪人:面谈
经纪人:签合同
经纪人:定机票
周杰伦:唱兰亭序
经纪人:收尾款
  • 静态代理优缺点

通过静态代理,我们达到了功能增强的目的,而且没有侵入原代码,这是静态代理的一个优点。

虽然静态代理实现简单,且不侵入原代码,但是,当场景稍微复杂一些的时候,静态代理的缺点也会暴露出来。

  1. 当需要代理多个类的时候,由于代理对象要实现与目标对象一致的接口,有两种方式:

    • 只维护一个代理类,由这个代理类实现多个接口,但是这样就导致代理类过于庞大
    • 新建多个代理类,每个目标对象对应一个代理类,但是这样会产生过多的代理类
  2. 当接口需要增加、删除、修改方法的时候,实现类与代理类都要同时修改,不易维护

  3. 代理类和实现类实现了相同的接口,这样就出现了大量的代码重复

3.动态代理

3.1 JDK动态代理

  • 抽象接口:star接口
public interface Star {
    /**
     * 唱歌
     */
    void sing();
}
  • 真实角色:RealStar实现类
public class RealStar implements Star {
    public void sing() {
        System.out.println("周杰伦:唱青花瓷");
    }
}
  • 代理工厂:
public class ProxyFactory {
    // 被代理的对象,实际的方法执行者(周杰伦)
    private Object star;

    public ProxyFactory(Object star) {
        this.star = star;
    }

    public Object getProxyObject(){

		//返回一个代理对象
        return Proxy.newProxyInstance(star.getClass().getClassLoader(),
                star.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("经纪人:面谈");
                        System.out.println("经纪人:签合同");
                        System.out.println("经纪人:定机票");
                        // 调用 周杰伦 的 method 方法
                        Object invoke = method.invoke(star, args);
                        System.out.println("经纪人:收尾款");

                        // 返回方法的执行结果
                        return invoke;
                    }
                });
    }
}
  • 运行结果
经纪人:面谈
经纪人:签合同
经纪人:定机票
周杰伦:唱青花瓷
经纪人:收尾款
  • Proxy.newProxyInstance()
    Proxy的newInstance方法对这个实例对象代理生成一个代理对象。看下newProxyInstance()的接口定义
    接口源代码
    各个参数的具体含义:
  • loder,选用的类加载器。因为代理的是star,所以一般都会用加载star的类加载器。
  • interfaces,被代理的类所实现的接口,这个接口可以是多个。
  • h,绑定代理类的一个方法。

loder和interfaces基本就是决定了这个类到底是个怎么样的类。而h是InvocationHandler,决定了这个代理类到底是多了什么功能。所以动态代理的内容重点就是这个InvocationHandler。

  • InvocationHandler接口
    InvocationHandler作用就是,当代理对象的原本方法被调用的时候,会绑定执行一个方法,这个方法就是InvocationHandler里面定义的内容,同时会替代原本方法的结果返回。
    InvocationHandler
    invoke方法各个参数的具体含义:
  • proxy,代理的实例对象。
  • method,对象被调用的方法。
  • args,调用时的参数。
  • 动态代理的使用场景

动态代理的好处我们从例子就能看出来,它比较灵活,可以在运行的时候才切入改变类的方法,而不需要预先定义它。

动态代理在Java中有着广泛的应用,比如Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。

标签:star,记录,void,经纪人,代理,println,动态,public
From: https://blog.csdn.net/qq_57036151/article/details/139469097

相关文章

  • Java动态获取实现类 Class.forName(clazz).newInstance()和applicationContext.getBea
    Java动态获取实现类Class.forName(clazz).newInstance()和applicationContext.getBean,beanMap寻找方式,JavaMap定义和初始化方法1.定义枚举类MyServiceTypeEnum.javapackagecom.example.core.mydemo.bean;publicenumMyServiceTypeEnum{SUBMIT_ORDER_SUCCESS("s......
  • rabbitMq实现系统内的短信发送设计&动态获取BEAN
    rabbitMq实现系统内的短信发送设计&动态获取BEAN1.短信非系统的重要节点操作,可以在任务完成之后,比如下单成功,发送下单成功的mq消息,短信服务接收到mq消息,动态的判断该短信的code,通过全局公共的父类(调用中台等接口获取全部所有需要的对象参数),获取短信中的{mobile}等参数来替换短......
  • 记录--前端起dev从110秒减少到7秒, 开发体验大幅提升
    ......
  • 记录工作中常用的 JS 数组相关操作
    工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~目录工作中常用的数组方法常见数组方法中的用法、以及坑slice()和splice()方法......
  • DotNet8自宿主web服务器搭建记录
    建立3个项目,分别是类库项目ConfigTool.WebSite、webapi项目ConfigTool.TestWebSite、webapi项目ConfigTool.WinService,目标框架均为.NET8。 其中控制台ConfigTool.TestWebSite方便开发调试,win服务ConfigTool.WinService作为宿主服务,类库ConfigTool.WebSite为自定义web服务器的......
  • 常用笔记语法记录
    一、markdown常用操作1、标题利用#实现一级标题二级标题三级标题以此类推2、段落背景色语法<table><tr><tdbgcolor=#FF00FF>背景色的设置是按照十六进制颜色值:#7FFFD4</td></tr></table><table><tr><tdbgcolor=#FF83FA>背景色的设置是按照十六进制颜色值:#FF83FA</t......
  • docker问题记录-pull不到镜像
    由于之前配置docker的buildx特性,修改了docker的daemon.json文件,误删除了镜像仓库地址,导致拉不到镜像重新编辑/etc/docker/daemon.json文件,添加如下内容{"registry-mirrors":["https://rnv4c7zq.mirror.aliyuncs.com","http://hub-mirror.c.163.com","https://doc......
  • 实战:干掉高德地图7.2.0版iOS客户端的反动态调试保护
    沙梓社snakeninny315年2月 高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。苹果自带的地图采用的就是高德的数据,足见高德之权威 昨天突发奇想,对高德地图上中一个官方不提供的功能产生了浓厚的兴趣,试图通过hack的方式来实现这个功能。谁知刚架上LLDB......
  • CF 做题记录
    前言CodeforcesRound836(Div.2)C.AlmostAllMultiples这题挺妙的。很容易发现$n%x==0$时无解。让\(p[x]=n,p[1]=x,p[n]=1\)就是一个可行解。但此题要求字典序最小,我们以\(8,2\)为例。现在的序列:28345671字典序最小的序列:24385671可以发......
  • 通过端口复用直接进行正向tcp代理--win会被识别为病毒
    学习项目,win会被识别为病毒,关闭病毒和威胁防护,参考https://blog.csdn.net/u_say2what/article/details/134669122main.gopackagemainimport( "context" "fmt" _"golang.org/x/sys/unix" "golang.org/x/sys/windows" "io" "......