广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java静态代理和动态代理的深入讲解
  • 373
分享到

Java静态代理和动态代理的深入讲解

2024-04-02 19:04:59 373人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对

代理模式

代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

代理模式的元素是:共同接口、代理对象、目标对象。

代理模式的行为:由代理对象执行目标对象的方法、由代理对象扩展目标对象的方法。

代理模式的宏观特性:对客户端只暴露出接口,不暴露它以下的架构

好处多多:中间隔离了一层,更加符合开闭原则

UML图

创建一个接口



public interface BuyCar {
 
 public void buyCar();
}

创建一个实现类



public class BuyCarImpl implements BuyCar {
 
 @Override
 public void buyCar() {
  System.out.println("我要买车~~~啦啦啦");
 }
}

静态代理:

创建一个代理类


 
public class BuyCarProxy implements BuyCar{
 private BuyCar buyCar;
 //注意事final修饰的关键字 不可修改
 //构造函数注入,需要被代理的对象
 public BuyCarProxy(final BuyCar buyCar) {
  this.buyCar = buyCar;
 }
 //静态代理- 的实现方式
 @Override
 public void buyCar() {
  System.out.println("不贷款,全款!买车前的准备~~~");
  buyCar.buyCar();
  System.out.println("买完车了,出去浪~~~");
 }
}

客户端调用



public abstract class ProxyTest implements BuyCar {
  public static void main(String[] args) {
    System.out.println("-+-+-+正常调用-+-+-+");
    BuyCar car=new BuyCarImpl();
    car.buyCar();
 
    System.out.println("-+-+-+使用静态代理-+-+-+");
    BuyCar proxy=new BuyCarProxy(car);
    proxy.buyCar();
  }
}
-+-+-+正常调用-+-+-+
我要买车~~~啦啦啦
 
-+-+-+使用静态代理-+-+-+
不贷款,全款!买车前的准备~~~
我要买车~~~啦啦啦
买完车了,出去浪~~~

 动态代理:

基于接口的动态代理类

特点:字节码随用随创建,随用随加载

作用:在不修改源码的基础上对方法增强

涉及的类:jdk官方提供的Proxy

如何创建代理对象:使用Proxy类中的newProxyInstance方法

创建代理对象的要求:被代理类至少实现一个接口

newProxyInstance方法的参数

   ClassLoader:类加载器,同于加载被代理对象字节码

   Class[]:字节码数组---用于让代理对象和被代理对象拥有相同的方法

   InvocationHandler:用于提供被增强的代码



public class DynamicProxy implements InvocationHandler {
  private BuyCar object;
 
  public DynamicProxy( BuyCar object) {
    this.object = object;
  }
 
  
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("不贷款,全款!买车前的准备~~~");
    Object result = method.invoke(object, args);
    System.out.println("买完车了,出去浪~~~");
    return result;
  }
}

客户端


 public static void main(String[] args) {
   
    System.out.println("-+-+-+使用基于接口的代理-+-+-+");
    //方式一、如不写动态代理类DynamicProxy,可以在这里使用内部类
    //声明一个final修饰的对象
    
 
    //方式二、使用DynamicProxy类
    //声明一个final修饰的对象
    final BuyCarImpl car=new BuyCarImpl();
    BuyCar proxy=(BuyCar)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(),new DynamicProxy(car));
    proxy.buyCar();
  }

基于子类的动态代理

特点:字节码随用随创建,随用随加载

作用:在不修改源码的基础上对方法增强

涉及的类:第三方cglib提供的Enhancer

如何创建代理对象:使用Enhancer类中create方法

创建代理对象的要求:被代理类不能是最终类

newProxyInstance方法的参数

   Class:用于被指定代理对象的字节码

   InvocationHandler:用于提供增强的方法


 public static void main(String[] args) {
 
    //使用基于子类的动态代理
    //需要引入jar包--cglib 本案例使用cglib3.3.0
    System.out.println("-+-+-+使用基于子类的代理-+-+-+");
    final BuyCarImpl car=new BuyCarImpl();
     BuyCar proxy= (BuyCar)Enhancer.create(car.getClass(), new MethodInterceptor() {
      @Override
      public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("不贷款,全款!买车前的准备~~~");
        Object result = method.invoke(car, args);
        System.out.println("买完车了,出去浪~~~");
        return result;
 
      }
    });
     proxy.buyCar();
  }

总结

到此这篇关于Java静态代理和动态代理的文章就介绍到这了,更多相关Java静态代理和动态代理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java静态代理和动态代理的深入讲解

本文链接: https://www.lsjlt.com/news/122928.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java静态代理和动态代理的深入讲解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对...
    99+
    2022-11-12
  • 深入理解Java动态代理与静态代理
    目录前言一、静态代理静态代理的使用与装饰者模式的区别二、动态代理JDK 动态代理CGlib 动态代理实现前言 学习 Spring 的过程中,不可避免要掌握代理模式。这篇文章总结一下代...
    99+
    2022-11-13
  • Java的动态代理和静态代理详解
    目录0、代理模式1、静态代理2、 加深理解3、动态代理动态代理的例子总结0、代理模式 为什么要学习代理模式?这是SpringAOP的底层【SpringAOP和SpringMVC】 代...
    99+
    2022-11-13
  • Java 静态代理与动态代理解析
    目录一、代码实践静态代理动态代理二、常见的动态代理场景Retrofit中的动态代理使用动态代理实现 onClick注入三、源码探索 Jdk 中的动态代理生成代理类四、总结静态代理: ...
    99+
    2022-11-13
  • JAVA代理,静态,动态详解
    目录代理静态代理动态代理JDK动态代理CGLib动态代理总结代理 为其他对象提供一种代理以控制这个对象的访问,在某些情况下一个对象不能直接访问那个对象时,代理就起到了客户端和被代理对...
    99+
    2022-11-12
  • 怎么理解Java和SAP ABAP的静态代理和动态代理
    本篇内容介绍了“怎么理解Java和SAP ABAP的静态代理和动态代理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下图是某应用里方法的常规...
    99+
    2023-06-02
  • Spring静态代理和动态代理代码详解
    本节要点:Java静态代理Jdk动态代理1 面向对象设计思想遇到的问题在传统OOP编程里以对象为核心,并通过对象之间的协作来形成一个完整的软件功能,由于对象可以继承,因此我们可以把具有相同功能或相同特征的属性抽象到一个层次分明的类结构体系中...
    99+
    2023-05-30
    spring 静态代理 动态代理
  • Java静态代理与动态代理案例详解
    代理模式 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象...
    99+
    2022-11-12
  • 解析Spring中的静态代理和动态代理
    目录一、静态代理1.1、静态代理的使用1.2、与装饰者模式的区别二、动态代理2.1、JDK 动态代理2.2、CGlib 动态代理实现一、静态代理 1.1、静态代理的使用 静态代理,代...
    99+
    2022-11-12
  • java代理模式(静态代理、动态代理、cglib代理)
    目录代理模式静态代理代码接口被代理对象代理对象测试动态代理代码:接口目标对象代理对象测试cglib代理代码:目标对象代理对象测试应用总结代理模式 代理模式(Proxy Pattern...
    99+
    2022-11-12
  • java静态代理与动态代理的概念
    本篇内容介绍了“java静态代理与动态代理的概念”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!    ...
    99+
    2023-06-02
  • 代理模式:JAVA静态代理和动态代理的实例和实现详解
    目录前言静态代理实现简述创建human接口创建接口实现类创建针对接口实现增强操作的代理代理实现效果动态代理实现简述要点:向上转型创建YoungMan接口创建两个接口实现类创建动态代理...
    99+
    2022-11-12
  • Java深入分析动态代理
    目录代理模式静态代理动态代理JDK动态代理CGLIB动态代理JDK代理与CGLIB代理的区别"代理"这个词相信大家并不陌生,简单来说就是代替厂家来售卖商品,代理替...
    99+
    2022-11-13
  • Java中动态代理和静态代理的示例分析
    这篇文章主要介绍了Java中动态代理和静态代理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。0、代理模式为什么要学习代理模式?这是SpringAOP的底层【Spri...
    99+
    2023-06-29
  • 使用Java怎么实现静态代理和动态代理
    本篇文章为大家展示了使用Java怎么实现静态代理和动态代理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代理模式代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。主要解决:在直接...
    99+
    2023-06-14
  • Java实例讲解动态代理
    JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节...
    99+
    2022-11-13
  • Java动态代理与静态代理实例分析
    这篇文章主要介绍了Java动态代理与静态代理实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java动态代理与静态代理实例分析文章都会有所收获,下面我们一起来看看吧。一、静态代理静态代理的使用静态代理,代...
    99+
    2023-07-02
  • Java反射的应用之动态代理深入理解
    目录一、代理模式的引入二、动态代理一、代理模式的引入 静态代理举例 特点:代理类和被代理类在编译期间,就确定下来了。 interface ClothFactory{ ...
    99+
    2022-11-12
  • JAVA中静态代理与动态代理的区别有哪些
    这期内容当中小编将会给大家带来有关JAVA中静态代理与动态代理的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。代理模式是java中最常用的设计模式之一,尤其是在spring框架中广泛应用。对于j...
    99+
    2023-05-31
    java 静态代理 动态代理
  • 如何进行Java代理设计模式的静态代理和动态代理实现
    今天就跟大家聊聊有关如何进行Java代理设计模式的静态代理和动态代理实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。面试问题:Java里的代理设计模式一共有几种实现方式?这个题目很...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作