代理模式

简介: 代理模式

1.静态代理

public interface Company {
    void cooperation();
}
public class Start implements Company {
    public void cooperation() {
        System.out.println("1");
    }
}

代理类

public class Agent implements Company {
    private Company company;
    public Agent(Company company) {
        this.company = company;
    }
    public void cooperation() {
        System.out.println("===before===");
        company.cooperation();
        System.out.println("===after===");
    }
}

调用

Company company=new Start();
Agent agent=new Agent(company);
agent.cooperation();

2.动态代理 jdk实现

public class JdkProxy implements InvocationHandler {
    private Company company;
    public JdkProxy(Company company) {
        this.company = company;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("=====before=====");
        Object result= method.invoke(company,args);
        System.out.println("=====after=====");
        return result;
    }
}

调用

动态生成代理对象需要调用JDK中的java.lang.reflect.Proxy类的newProxyInstance方法,这个方法需要三个参数:

@CallerSensitive

public static Object newProxyInstance(ClassLoader loader,]Class[] interfaces,InvocationHandler h)

ClassLoader loader:类加载器,用来加载目标对象类,因为是在运行时获得目标对象,所以肯定需要用到反射。

Class[] interfaces:目标对象类实现的接口集合,这些接口中定义目标对象可以执行的方法。

InvocationHandler h:这个参数代表的是动态代理对象在调用方法的时候,会将方法转发到哪一个invocationHandler对象身上,InvocationHandler是个接口,

需要自己实现它,然后定义自己的动态代理执行方法。

创建包含动态代理对象具体执行方法的实现类。

Company company = new Start();
JdkProxy jdkProxy = new JdkProxy(company);
Company proxy = (Company) Proxy.newProxyInstance(jdkProxy.getClass().getClassLoader(), company.getClass().getInterfaces(), jdkProxy);
proxy.cooperation();

3.cglib 动态代理

public class AloneStart {
    /** 合作 */
    public void cooperation() {
        System.out.println("is show time");
    }
}

代理类

package com.jd.xq.proxy;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
 * @author duanxiaoqiu
 * @Date 2019-12-18 14:44
 **/
public class CglibProxy implements MethodInterceptor {
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("=====before====");
        Object result = methodProxy.invokeSuper(o, objects);
        System.out.println("=====after====");
        return result;
    }
}
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(AloneStart.class);
enhancer.setCallback(new CglibProxy());
AloneStart aloneStart = (AloneStart) enhancer.create();
aloneStart.cooperation();

spring aop等


相关文章
|
11月前
|
Ubuntu Linux Android开发
Android Studio支持多种操作系统
Android Studio支持多种操作系统
523 1
|
9月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
420 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
7月前
|
人工智能 IDE 测试技术
魔搭×通义灵码:0代码基础、0门槛在线编程做应用
本节课主要介绍了如何利用 Notebook IDE 环境和通义灵码工具来具体开发 AI 产品,通过前面的介绍,可以感受到好的开发环境和开发工具往往可以让开发过程事半功倍,也可以更快更好地解决一些实际问题。随着 AI 代码生成工具不断成熟,动动手指,你的 AI 产品马上变成现实~
|
Java 开发者 Spring
【SpringBoot 异步魔法】@Async 注解:揭秘 SpringBoot 中异步方法的终极奥秘!
【8月更文挑战第25天】异步编程对于提升软件应用的性能至关重要,尤其是在高并发环境下。Spring Boot 通过 `@Async` 注解简化了异步方法的实现。本文详细介绍了 `@Async` 的基本用法及配置步骤,并提供了示例代码展示如何在 Spring Boot 项目中创建与管理异步任务,包括自定义线程池、使用 `CompletableFuture` 处理结果及异常情况,帮助开发者更好地理解和运用这一关键特性。
1744 1
|
11月前
「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件
Slider 和 Progress 是鸿蒙系统中的常用 UI 组件。Slider 控制数值输入,如音量调节;Progress 显示任务的完成状态,如下载进度。本文通过代码示例展示如何使用这些组件,并涵盖 进度条类型介绍、节流优化、状态同步 和 定时器动态更新。
293 7
「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件
|
机器学习/深度学习 搜索推荐 知识图谱
大模型与搜索引擎的互补性
【2月更文挑战第21天】大模型与搜索引擎的互补性
454 1
大模型与搜索引擎的互补性
|
11月前
|
负载均衡 安全 网络协议
使用高防ip后源站IP暴露的解决办法
使用高防ip后源站IP暴露的解决办法
164 3
|
11月前
|
机器学习/深度学习 人工智能 供应链
AI技术在医疗领域的应用与未来展望###
本文深入探讨了人工智能(AI)技术在医疗领域的多种应用及其带来的革命性变化,从疾病诊断、治疗方案优化到患者管理等方面进行了详细阐述。通过具体案例和数据分析,展示了AI如何提高医疗服务效率、降低成本并改善患者体验。同时,文章也讨论了AI技术在医疗领域面临的挑战和未来发展趋势,为行业从业者和研究人员提供参考。 ###
|
测试技术
测试用例设计方法之基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法,设计出的测试用例要保证在测试中程序的语句覆盖100%,条件覆盖100%
699 7
测试用例设计方法之基本路径测试法