代理模式概述

本文深入探讨了Java代理模式,包括其在代码设计中的作用,如在方法执行前后添加增强逻辑。代理模式分为静态代理和动态代理。静态代理需要预先编写代理类,而动态代理则在运行时通过反射机制动态创建。动态代理主要通过Java的Proxy类和InvocationHandler接口实现,后者定义了代理逻辑。动态代理广泛应用于各种框架中,如MyBatis和Spring。
摘要由CSDN通过智能技术生成

概述

在代码设计中,代理模式作用主要就是让 "被代理对象" 的某个方法执行之前或者执行之后加入其他增强逻辑。

  • 前增强 : 例如获取当前时间
  • 被代理对象调用方法
  • 后增强 : 例如获取当前时间
  • 计算方法执行的时间

代理的前提条件

  • 抽象角色 :声明功能
  • 代理角色 :实现抽象功能 , 完成代理逻辑
  • 被代理角色 :实现抽象功能

意味着被代理角色和代理角色有着共同的父类型(既抽象角色) , 例如我要租房子, 我只能找房产中介, 不能找票贩子

 代理模式存在两种实现方式:

  • 静态代理
  • 动态代理

静态代理

  • 静态代理是由程序员创建 或 工具生成代理类的源码,再编译代理类。

在程序运行前就已经存在代理类的字节码文件,代理类和被代理类的关系在运行前就确定了。

简单理解 : 在程序运行之前 , 代理类就存在了,这就是静态代理 ; 动态代理是程序运行时动态生成代理类

  • 静态代理实现的步骤 :
    • 存在一个抽象角色
    • 定义被代理角色
    • 定义代理,增强被代理角色的功能

动态代理

概述

在实际开发过程中往往我们自己不会去创建代理类而是通过JDK提供的Proxy类在程序运行时,运用反射机制动态创建而成

这就是我们所谓的动态代理

与静态代理之间的区别,在于不用自己写代理类

虽然我们不需要自己定义代理类创建代理对象,但是我们要定义对被代理对象直接访问方法的拦截,原因就是对拦截的方法做增强。

动态代理技术在框架中使用居多,例如:很快要学到的数据库框架MyBatis框架等后期学的一些主流框架技术(Spring,SpringMVC)中都使用了动态代理技术。

API学习

Proxy类

  • java.lang.reflect.Proxy

类提供了用于创建动态代理类和对象的静态方法

它还是由这些方法创建的所有动态代理类的超类(代理类的父类是Proxy)。

public static Object newProxyInstance (
  ClassLoader loader, 
  Class<?>[] interfaces,  
  InvocationHandler h ) 获取代理对象的方法 
​
- 返回值:该方法返回就是动态生成的代理对象
- 参数列表说明:
  1. ClassLoader loader     - 定义代理类的类加载器
  2. Class<?>[] interfaces  - 代理类要实现的接口列表,要求与被代理类的接口一样。
  3. InvocationHandler h    - 就是具体实现代理逻辑的接口

InvocationHandler接口

源码 :

interface InvocationHandler{
    public Object invoke(Object proxy, Method method, Object[] args);  //代理逻辑
}

java.lang.reflect.InvocationHandler是代理对象的实际处理代理逻辑的接口,具体代理实现逻辑在其 invoke 方法中。所有代理对象调用的方法,执行是都会经过invoke。因此如果要对某个方法进行代理增强,就可以在这个invoke方法中进行定义。

方法说明如下:

public Object invoke(Object proxy, Method method, Object[] args);

        1. 返回值:方法被代理后执行的结果。

        2. 参数列表:

                1. proxy - 就是代理对象

                2. method - 代理对象调用的方法

                3. args - 代理对象调用方法传入参数值的对象数组.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值