JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现

news2024/11/15 7:34:53

JAVA中的代理:代理的作用+静态代理的实现+动态代理的实现

    • 一、代理的作用
    • 二、静态代理实现方式
      • 2.1 实现原理
      • 2.2 示例
    • 三、动态代理

一、代理的作用

代理是一种设计模式

主要目的:提供了对目标对象另外的访问方式

在这里插入图片描述

代理的好处:

  1. 目标对象可以间接访问
  2. 代理的主要作用就是增强了目标对象,可以在目标对象实现的基础上增强额外的功能,即扩展目标对象的功能
  3. 不要随意修改原有代码,如果需要修改,可以通过代理去扩展

java代理的实现

  • 静态代理
  • 动态代理
    • jdk动态代理(接口)
    • CGLIB(继承)

二、静态代理实现方式

2.1 实现原理

在这里插入图片描述

2.2 示例

最开始我们想购买海外商品时,必须通过代购,因为只有代购知道真买产品在哪里

在这里插入图片描述

//目标接口
public interface ByClothes {
    void clothes(String size);
}
//目标类
public class ClothesFactory implements ByClothes{
    @Override
    public void clothes(String size) {
        System.out.println(size+" 尺寸的衣服制作完毕");
    }
}

代理类也是实现目标接口,但是里面的clothes方法调用的是目标类的方法,在代理类中不止有目标类的方法还有其他的方法

//代理类
public class ClothesProxy implements ByClothes{

    private ClothesFactory clothesFactory;
    //构造方法为clothesFactory赋值
    public ClothesProxy(ClothesFactory clothesFactory) {
        this.clothesFactory = clothesFactory;
    }

    @Override
    public void clothes(String size) {

        frontService();
        //目标对象的方法
        clothesFactory.clothes(size);
        endService();
    }
    //售前服务
    public void frontService(){
       System.out.println("售前服务");
    }
    //售后服务
    public void endService(){
        System.out.println("售后服务");
    }
}

三、动态代理

示例2

成立代购公司,能够代购多种产品,这里需要实现InvocationHandler接口,重写invoke方法,在外部是调用的代理对象的invoke方法,但是在内部已经将其重写为目标对象的方法,并且还有其他的方法,达到增强的效果

public class Company implements InvocationHandler {

    private Object obj;

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        frontService();

        Object obj2 = method.invoke(obj,args);

        endService();
        return obj2;
    }



    //售前服务
    public void frontService(){
        System.out.println("售前服务");
    }
    //售后服务
    public void endService(){
        System.out.println("售后服务");
    }

    //获取代购员
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this);
    }

}
public class MainTest {
    public static void main(String[] args) {
        //目标对象
        ClothesFactory clothesFactory = new ClothesFactory();

        Company company = new Company();
        //设置目标对象
        company.setObj(clothesFactory);

        //代理对象
        ByClothes good1 = (ByClothes)company.getProxyInstance();

        good1.clothes("xx1");




    }

}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

告别低效率||智能BI财务分析软件

在当今信息爆炸的时代,财务数据作为企业运营的核心,其处理和分析的效率直接关系到企业的决策速度和市场竞争力。奥威BI软件凭借其卓越的性能和智能化的分析功能,为企业提供了一套高效、准确的财务分析解决方案。 奥威BI软件在财务分析中的优…

从0开始回顾ElasticSearch

1 elasticsearch概述 1.1 elasticsearch简介 官网: https://www.elastic.co/ ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的…

angr使用学习(持续更新)

首先我是直接在kali中安装的,也是边练边学的。 嗯,要在纯净python环境,所以是在 virtualenv 虚拟环境里,也不是特别会用这个,按照教程一步步做的 source venv/bin/activate 进入了对应环境 退出是 deactivate en,ipy…

重生之 SpringBoot3 入门保姆级学习(06、属性绑定)

重生之 SpringBoot3 入门保姆级学习(06、属性绑定) 2.3.1 使用 ConfigurationProperties2.3.2 使用 EnableConfigurationProperties 2.3.1 使用 ConfigurationProperties application.properties 文件书写相关配置 pig.id1 pig.name王萍 pig.age21方法一…

Sping源码(九)—— Bean的初始化(非懒加载)— ConversionService

序言 经过前面一系列的加载、解析等准备工作,此刻refresh方法的执行已经来到了尾声,接下来我们用几篇文章着重的介绍一下Bean的初始化 代码 着重看refresh()主流程中的finishBeanFactoryInitialization()方法。 finishBeanFactoryInitialization 方法…

python深入探索斐波那契数列:代码示例与不满足的外围条件

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构:https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构,以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

五款屏幕监控软件测评,哪一款屏幕监控软件适合企业

市场上有多款屏幕监控软件,其中一些因其实用的功能、良好的用户体验和广泛的用户基础而获得了较高的市场占有率和口碑。以下几款是较为受欢迎且功能全面的屏幕监控软件: 1、安企神软件: 领取7天试用版:https://work.weixin.qq.co…

【NumPy】关于numpy.sort()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

一致 VS 正确

“代码命名时,一致大于正确” 本文适合以下小伙伴阅读: 经常会有疑惑:这谁的单词拼错了,我之后要将错就错吗?时常感觉到:项目中的命名好乱啊,明明是一个东西怎么一堆不同的名字 好了&#xf…

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中,企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求,MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性,能够根据不同行业的特性,为企业提供量身定制…

告别繁琐!Xinstall助你轻松实现APP地推结算,提升推广效率

随着移动互联网的迅猛发展,APP市场竞争日益激烈。面对线上推广转化率下降、成本上升的挑战,越来越多的APP厂商开始尝试线下地推这一更为直接、有效的推广方式。然而,地推结算过程中的种种问题却让许多企业头痛不已。今天,我们将为…

信息化项目必须进行验收测试吗?软件测试公司验收测试流程分享

信息化项目验收是指在软件开发完成之后,对其进行独立检查和确认,以确定它是否达到了预期的质量和功能需求。在进行验收之前,必须进行验收测试,这是非常重要的一步。 为什么要进行验收测试呢?好处可不少哦!…

【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图 收起状态 展开状态 2. 代码实现 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…

人工智能应用层岗位—AI项目经理/AI产品经理

AI是一门技术&#xff0c;最终落实成产品才能具备商业价值 应用层&#xff0c;就是面向特定应用场景&#xff0c;形成人工智能软硬件产品或解决方案。主要包括行业AI解决方案和热门产品&#xff0c;如自动驾驶、机器人、智能家居、可穿戴的智能设备等 相应的&#xff0c;就会…

猫狗分类识别模型建立①数据标记

一、labelImg库说明 LabelImg是一款非常流行的图像标注工具&#xff0c;广泛用于机器学习和计算机视觉领域。以下是关于LabelImg的详细介绍&#xff1a; 主要功能和特点 1.图像标注 允许用户在图像中标注物体&#xff0c;选择特定区域&#xff0c;并为这些区域添加标签或类…

C语言基础——数组

{\▁/} ( / 。\ ) / ⊃&#x1f494;\⊃ 为什么我那么努力还是得不到那么多赞 ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

链接预测.

在某些场景中&#xff0c;用户可能希望预测给定节点之间是否存在边&#xff0c;这样的任务称作链接预测任务。 假设输入结点之间是全链接图&#xff0c;连接预测的目的是给边打上标签。 挑战 最简单的是用图的邻接矩阵来表示结点之间的边&#xff0c;但当节点数量多的时候&am…