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 - 代理对象调用方法传入参数值的对象数组.
该方法执行时机是,代理对象调用方法时触发执行