代理模式(Proxy)-利用反射机制实现的动态代理

【Java开发系列】Java实现静态代理和动态代理 【Java开始系列】Java实现静态代理和动态代理 阅读详情

   Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Proxy(代理)模式是比较常用的一个模式.
       在应用中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切。
 
       Proxy 的使用场景:
       1.远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
       2.虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
       3.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
       4.保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。
       5.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
       6.防火墙(Firewall)代理:保护目标,不让恶意用户接近。
       7.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
       8.智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

       这里介绍的是如何利用反射机制实现动态代理:
       最常见的情况是:但一个应用已经开发结束后,我们需要对针对一些对象的操作记录日志或者做一些额外的工作;在这种情况下我们如果为每一个对象设计一个代理类的话显然会增加很多工作量,如果采用反射机制的话就可以轻松的解决这个问题。

       在此写了4个java类来描述说明Proxy设计模式的动态代理实现方式;

      1、 ReflectProxy.java      动态代理类
      2、 IHelloWorld.java       HelloWorld接口
      3、 HelloWorld.java        HelloWorld实现类
      4、 ReflectProxyText.java  带有main方法的测试类

===============   1、 ReflectProxy.java
package proxy;

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

//通过实现InvocationHandler接口的invoke方法 促使被代理对象的方法别调用时都会出发invoke方法
public class ReflectProxy implements InvocationHandler {

  // 被代理的对象
  private Object proxyObject;

  public ReflectProxy(Object proxyObject) {
    this.proxyObject = proxyObject;
  }

  // 通过工厂模式生成一个代理对象
  public static Object factory(Object proxyObject) {
    Class cls = proxyObject.getClass();
    return Proxy.newProxyInstance(cls.getClassLoader(),
        cls.getInterfaces(), new ReflectProxy(proxyObject));

  }

  //InvocationHandler 接口中的方法
  public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
   
    //在调用被代理类的实际方法前的操作
    doBeforeCalling(method);

    //输出被代理类的实际方法中的参数
    if (args != null) {
      for (int i = 0; i < args.length; i++) {
        System.out.println("args[" + i + "]=" + args[i] + "");
      }
    }
   
    //调用被代理类的实际方法
    Object o = method.invoke(proxyObject, args);

    //在调用被代理类的实际方法后的操作
    doAfterCalling(method);

    return o;
  }
 
  //在调用被代理类的实际方法前的操作
  private void doBeforeCalling(Method method){
    System.out.println("before calling [" + method + "]");
  }

  //在调用被代理类的实际方法后的操作
  private void doAfterCalling(Method method){
    System.out.println("after calling [" + method + "]");
  }

}
===============   1 end

 

===============   2、 IHelloWorld.java
package proxy;

public interface IHelloWorld {

  public void sayHello();
  public void sayBye();
  public void saySomething(String msg);
 
}
===============   2 end

 

===============   3、 HelloWorld.java
package proxy;

public class HelloWorld implements IHelloWorld {

  public void sayBye() {
    System.out.println("Hello World!");
  }

  public void sayHello() {
    System.out.println("Bye!");
  }

  public void saySomething(String msg) {
    System.out.println(msg);
  }
}
===============   3 end

 

===============   4、 ReflectProxyText.java
package proxy;

import java.util.ArrayList;
import java.util.List;

public class ReflectProxyText {

  public static void main(String[] args) {
    try {
      //代理List接口对象
      Object obj = ReflectProxy.factory(new ArrayList<Object>(0));
      List list = (List)obj;
      list.add("A");
      list.add("B");
     
      //代理IHelloWorld接口对象
      obj = ReflectProxy.factory(new HelloWorld());
      IHelloWorld helloWorld = (IHelloWorld)obj;
      helloWorld.sayHello();
      helloWorld.saySomething("How is everything!");
      helloWorld.sayBye();

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
===============   4 end

从房屋买卖场景深入理解Java Proxy代理模式 在软件工程中,接口是一种契约,规定了多个类之间可以遵循的统一方法签名集合。对于代理模式而言,公共接口是整个模式成立的前提条件。它确保代理类和目标类对外呈现一致的行为特征,从而使客户端能够以相同的方式对待两者,达到多态的效果。以房屋交易系统为例,假设我们有一个接口,用于描述所有与房屋交易相关的基本操作:该接口定义了两个基本方法:viewHouse表示客户查看房源信息;sellHouse表示完成房屋出售交易。无论是房主本人还是中介机构,只要提供此类服务,就必须遵守这一约定。 阅读详情

相关推荐

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

java反射实现动态代理模式

代理模式的作用是:为其他对象提供一种可以控制的访问方式, 代理的角色: 1.抽象角色  声明真实对象和代理对象需要实现的接口; 2.代理角色  代理对象内部含有对真实对象的引用,从而可以操纵真实的对象,同时代理对象 提供与真实对象相同的接口,以便在任何时刻都能替代真实对象,同时代理对象可以在执行真实对象操作时, 附加其他的操作,想当于对真实对象进行封装。 3.真实角色  实现抽

a15271801276的博客 983

IT资产管理(三)之GLPI资产录入

glpi 在 10 版本之后已经有自带的 glpi-agent 代理程序可自动获取服务器、电脑等的信息并进行自动录入和更新,不再依赖 10 版本之前的 fusioninventory 插件或者第三方资产统计平台 OCS Inventory 等

予挚之的博客 2981

反射实现动态代理原理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33953249的博客 216

FPGA驱动OV5640:从SCCB协议到图像数据采集的实战解析

本文详细解析了使用FPGA驱动OV5640摄像头模组的完整流程,从SCCB协议通信、寄存器配置到图像数据采集。重点阐述了SCCB(与I2C类似)协议的实现细节、关键的上电复位时序,以及如何通过状态机解析视频流时序并捕获图像数据,为嵌入式视觉开发提供了实战指南。

weixin_29191761的博客 187

技术解析:PETR如何通过3D位置编码革新多视角3D目标检测

本文深入解析了PETR模型如何通过创新的3D位置编码技术革新多视角3D目标检测。它摒弃了DETR3D复杂的投影采样机制,通过3D坐标生成器和编码器,将3D几何信息直接注入2D图像特征,构建出3D感知特征。该方法简化了流程,提升了模型对空间关系的理解能力与训练稳定性,为自动驾驶等领域的精准感知提供了新思路。

weixin_29079743的博客 212

spring-07.动态代理

1.使用代理模式的作用 功能增强:在你原有的功能上,增加了额外的功能,新增的功能,叫做功能增强 控制访问:代理类不让你访问目标,例如商家不让用户访问厂家 2.静态代理 模拟一个用户购买U盘的行为 用户是客户端类 商家:代理,代理某个品牌的u盘 厂家:目标类 三者的关系:用户(客户端)–商家(代理)–厂家(目标) 实现步骤: 创建一个接口,定义卖U盘的方法,表示你的厂家和商家做的事情 创建厂家类,实现1步骤的接口 创建商家,就是代理,也需要实现1步骤的接口 创建客户端类,调用商家的方法买U盘 具体实现

u012748059的博客 655

锐捷交换机堆叠配置举例

一、组网需求: 1)四台S2628G进行堆叠; 2)设备在堆叠前先设置好优先级; 3)使用光口堆叠的设备如RG-S2928G-E相关配置 二、组网拓扑 三、配置要点: 普通堆叠设备不需要配置,只要把堆叠模块和线缆连接好即可 堆叠模块不支持热插拔,即插在模块连上线缆后不能立即生效,需要重启设备才生效。 如果拔掉堆叠插槽后,想再插上模块堆叠,那么必须重启设备才生效 设备堆叠需要协商参数,时间会比较久,请耐心等待 堆叠时设备建议是...

dongsheng_9234的专栏 8282

Java8之动态代理

参考资料: 《Java动态代理分析》 《JAVA动态代理》 《Java 动态代理类》 写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。

CRUD工程师 786

Spring AI Alibaba 1.x 源码分析-架构设计

本文通过分析Spring AI Alibaba 框架的源码,分析出其原理和架构设计,无论是用于项目开发、技术评估还是团队培训都具有重要价值。

program哲学 487

线结构光相机原理详解以及精度控制总结

摘要:线阵结构光相机是工业三维检测的核心设备,结合线阵相机的高分辨率与结构光的主动三维成像能力。其工作原理基于线激光投射、逐线扫描、亚像素级条纹提取及三角测量法实现三维重建。精度受硬件、校准、环境和算法四因素影响,需通过优化硬件选型(如小像元相机、窄线宽激光)、精准校准(相机内参、激光平面)、环境控制(遮光、隔振、恒温)及算法优化(Steger算法、点云后处理)来提升。典型应用(卷材、轨道检测)中深度精度可达5-20μm,需根据场景需求平衡参数配置。

start_up_go的博客 937

一文带你弄懂 Java 动态代理

在说动态代理之前,先来简单看下代理模式。 代理是最基本的设计模式之一。它能够插入一个用来替代“实际”对象的“代理”对象,来提供额外的或不同的操作。这些操作通常涉及与“实际”对象的通信,因此“代理”对象通常充当着中间人的角色。 1.代理模式 代理对象为“实际”对象提供一个替身或占位符以控制对这个“实际”对象的访问。被代理的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。来看下类图: 再来看下类图对应代码,这是 IObject 接口,真实对象 RealObj 和代理对象 ...

Javaesandyou的博客 290

【RT-DETR涨点改进】全网独家创新、细节涨点改进篇 | ICML 2024 | RT-DETR引入ICB交互式卷积模块和ASB自适应频谱模块,助力目标检测、异常检测有效涨点、含多种创新改进点

RT-DETR目标检测模型通过引入ICB和ASB模块实现性能提升。ICB模块采用多尺度卷积交互,有效捕获局部和长程依赖特征;ASB模块通过自适应频域滤波优化特征表示,降低噪声干扰。两者结合使模型在复杂场景中表现更优,显著提升检测精度和鲁棒性。文章详细介绍了模块原理、代码实现及配置方法,并提供了8种改进版本的YAML配置文件,适用于不同网络结构。这些创新改进为RT-DETR模型提供了高效涨点方案,特别适合复杂背景和高噪声环境下的目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 211

java静态代理和动态代理

代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。但是静态代理的缺点也暴露了出来:由于代理只能为一个类服务,如果需要代理的类很多,那么就需要编写大量的代理类,比较繁琐。被代理类被传递给了代理类HelloProxy,代理类在执行具体方法时通过所持用的被代理类完成调用。

Thunderclap的博客 236

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式学习(九): 结构型模式之代理模式(详解)

2019年7月28日 目录 写在开头 静态代理实现 动态代理实现 剖析动态反射 Proxy.newProxyInstance 写在末尾 写在开头 代理模式可以有两种实现的方式,一种是静态代理类,另一种是各大框架都喜欢的动态代理。下面以java语言为例,给大家详细解释代理模式的用法。 结构型模式讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一...

Diligence is the mother of success. 468

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[转载] Java中的静态代理以及动态代理

动态代理是指在运行时动态生成代理类。即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。与静态处理类相比,动态类有诸多好处。不需要为(RealSubject)写一个形式上完全一样的封装类,假如主题接口(Subject)中的方法很多,为每一个接口写一个代理方法也很麻烦。如果接口有变动,则目标对象和代理类都要修改,不利于系统维护;使用一些动态代理的生成方法甚至可以在运行时制定代理类的执行逻辑,从而大大提升系统的灵活性。

TomasTu 201

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

动态代理

代理模式 为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。 其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。 静态代理 创建一个接口,然后创建被代理的类实现该接口并且实现该接口中

Kevinnsm的博客 168

代理模式--静态代理与动态代理 - 的区别联系

Proxy代理模式是什么? Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 使用场合 如果需要委托类处理某一业务,那么我们就可以先在代理类中统一处理然后在调用具体实现类 代理模式分类 静态代...

qq_43223415的博客 365

JDK动态代理

要知道动态代理,首先要知道代理模式。 代理模式下,有两个角色,核心任务的完成者叫做委托类,另一个叫做代理类。委托类的“能力”封装成接口,而代理类实现了委托类的所有接口,表示代理类和委托类具有相同的能力,代理类可以为委托类代理完成所有业务,但核心业务还是委托类完成。 代理模式分为两种,静态代理以及动态代理。 动态代理就好比一个万能的工具人,啥都能干,卖手机,卖汽车,买房…,只要有委托类将任务交给代理类代理,它就能干。动态代理相较于静态代理只能代理已知功能,灵活性更高。不需要像静态代理一样,一个功能就需要编写一

qq_44707077的博客 220

Day10_静态代理与JDK动态代理

一、什么是代理模式 1.定义:为其他对象提供一种代理以控制对这个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 2.例子:最开始接触JDBC操作数据库的时候,业务层每一个方法都需要做以下几件事 (1)打开数据库连接 (2)执行我们想要的操作 (3)关闭数据库连接 此时,我的核心业务是第(2)步,其余两步为辅助业务。当核心业务与辅助业务写在了一个方法中时。会出现以下问题: ①代码业务冗余 ②开关数据库连接大量的重复 3.通过代理模式,我们

Dxkr_CB的博客 180

面试必问的Java-1.0:动态代理-静态代理

Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题。 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对...

u010953880的专栏 443

java静态代理和动态代理,安卓内存优化面试

按照代理类的创建时期,代理类可分为两种。 静态代理类: 由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理类:在程序运行时,运用反射机制动态创建而成。 二、静态代理类 如下, HelloServiceProxy 类是代理类,HelloServiceImpl类是委托类,这两个类都实现了HelloService接口。其中HelloServiceImpl类是 HelloService接口的真正实现者,而HelloServiceProxy类是通过调用H

m0_64383081的博客 110

JAVA动态代理

代理模式 为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。 其实就是代理类为被代理类预处理消息、过滤消息并在此之后将消息转发给被代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系(即上面提到的持有的被带离对象的引用),代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。 静态代理 创建一个接口,然后创建被代理的类实现该接口并且实现该接口中

qq_43842093的博客 228

代理模式的相关配置方法

Proxy:代理类,其内部含有对真实主题的引用,它可以访问、控制或扩展RealSubject的功能。RealSubject:真实主题类,实现Subject中的具体业务,是代理对象所代表的真实对象。Subject:抽象主题类,通过接口或抽象类声明主题和代理对象实现的业务方法。

cccbbbmmm的博客 68

Java-JDK代理模式使用及实现原理分析

Java-JDK代理模式使用及实现原理分析第一章:代理的介绍1.1 什么是代理?1.2 为什么要找中介第二章:静态代理2.1 使用代理模式的作用2.2 实现代理的方式2.3 具体实现2.4 静态代理的优缺点第三章 动态代理3.1 静态代理和动态代理模式的对比3.2 动态代理的介绍3.3 动态代理的实现:3.4 回顾反射 Method类3.5 JDK动态代理第四章 实现动态代理的步骤第五章 JDK动态代理执行流程第六章 静态代理项目中的应用 第一章:代理的介绍 动态代理(理解) 基于反射机制 主要内容:

Eli_Code 535
上一篇: JSP生成静态页-Tomcat提高性能之道
下一篇: java中的for each循环
J2EE_dev
博客等级 码龄18年 237粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值