1.1 概述

在代码执行前,没有代理类,代理类是在程序运行的时候动态生成,代理类而是通过JDK提供的Proxy类在程序运行时,运用反射机制动态创建的,无需程序员手工编写它的源代码。

1.1.1 特点

只能针对接口的实现类做代理对象,普通类是不能做代理对象的。与静态代理之间的区别,在于不用自己写代理类。

1.1.2 作用

动态代理可以为 "被代理对象" 的所有接口的所有方法做代理,动态代理可以在不改变方法源码的情况下,实现对方法功能的增强,被代理对象直接访问方法的拦截,原因就是对拦截的方法做增强。

1.2 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     - 就是具体实现代理逻辑的接口
    
    类加载器 = 被代理对象.getClass().getClassLoader();
    接口列表 = 被代理对象.getClass().getInterfaces();
    调用处理器 = new InvocationHandler(){   实现  invoke 方法 };
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   - 代理对象调用方法传入参数值的对象数组.
    
   该方法执行时机是,代理对象调用方法时触发执行
版权属于:it小离

本文链接: https://www.itxiaoli.cn/archives/jdkProxy.html

版权声明:本站文章采用 署名-非商业性使用-相同方式共享 4.0

最后修改:2022 年 04 月 12 日 03 : 27 PM
如果觉得我的文章对你有用,请随意赞赏